簡體   English   中英

當外鍵不同時,如何在MySQL中將主鍵連接到兩個外鍵?

[英]How to join a primary key to two foreign keys in MySQL when the foreign keys will be different?

所以,我的問題是這樣的:我與一家銷售公司合作,並且正在使用MS Access 2007作為前端,以MySQL 5.6 Server作為后端來開發應用程序。 我正在嘗試生成一個視圖,該視圖計算每個代表的佣金數據。

我的DDL如下:

CREATE TABLE emp_employees
    (`id` int, `tsr_code` int, `first_name` varchar(9), `location_id` int)
;

INSERT INTO emp_employees
    (`id`, `tsr_code`, `first_name`, `location_id`)
VALUES
    (47, 829, 'ELIZABETH', 6),
    (199, 818, 'ERIC', 6),
    (1642, 301, 'JACK', 4),
    (2346, 619, 'SHANNA', 5),
    (2386, 899, 'MICHAEL', 3),
    (2490, 590, 'KARRIE', 4),
    (2642, 386, 'MINDI', 3),
    (2914, 615, 'REMELL', 3),
    (3150, 025, 'TEAL', 3),
    (3156, 609, 'JESSICA', 5)
;


CREATE TABLE x_recap
    (`recap_id` int, `sale_date` datetime, `location_id` int, `tsr_id` int, `ver_id` int, `tsr_cpo` decimal(10,4), `ver_cpo` decimal(10,4))
;

INSERT INTO x_recap
    (`recap_id`, `sale_date`, `location_id`, `tsr_id`, `ver_id`, `tsr_cpo`, `ver_cpo`)
VALUES
    (423670, '2017-01-23 08:15:44', 5, 3156, 2346, 9.0000, 1.5000),
    (423671, '2017-01-23 08:16:03', 6, 199, 47, 13.5000, 1.5000),
    (423672, '2017-01-23 08:16:41', 3, 3150, 2914, 4.7500, 0),
    (423673, '2017-01-23 08:17:08', 3, 2386, 2642, 8.7500, 1.50),
    (423674, '2017-01-23 08:17:28', 5, 2346, 2346, 5.7500, 0.50)
;

所需結果:

+------------+-------------+------------+----------+----------+
| sale_date  | location_id | first_name | tsr_comm | ver_comm |
+------------+-------------+------------+----------+----------+
| 2017-01-23 |           3 | MICHAEL    |   8.7500 |   0.0000 |
| 2017-01-23 |           3 | MINDI      |   0.0000 |   1.5000 |
| 2017-01-23 |           3 | REMELL     |   0.0000 |   0.0000 |
| 2017-01-23 |           3 | TEAL       |   4.7500 |   0.0000 |
| 2017-01-23 |           5 | JESSICA    |   9.0000 |   0.0000 |
| 2017-01-23 |           5 | SHANNA     |   5.7500 |   2.0000 |
| 2017-01-23 |           6 | ELIZABETH  |   0.0000 |   1.5000 |
| 2017-01-23 |           6 | ERIC       |  13.5000 |   0.0000 |
+------------+-------------+------------+----------+----------+

和SQL Fiddle相同

編輯(2017-12-13):請注意,員工2346如何使用$ 1.50進行一次驗證(recap_id = 423670),即``Shanna''。 她還進行了一次自我驗證的交易(recap_id = 423674),需要另外支付$ .50的驗證佣金和$ 5.75的交易。 這些必須分開跟蹤。

從小提琴中可以看到,我可以通過使用Union查詢使數據以我想要的方式顯示。 當我在“摘要”中加載4100名員工記錄和236K銷售條目時,問題就變成了。 閱讀后,我了解到我的查詢現在花費了很長時間(約30秒),因為MySQL正在根據聯合創建臨時表,然后根據未索引的臨時表執行外部查詢。 當我向每個Union添加WHERE子句時,時間將大大減少。

我覺得必須缺少一些東西:特殊的內部聯接,某些東西。 即使我每天都使用MySQL,我還是相當陌生的(我的工作通常只需要一些concat()並偶爾進行內部聯接)。 我幾乎對任何事情都開放。 如果事實證明這是最好的選擇,我將不做部分重新設計表 (也許會得到一些社區幫助)。

目標:對於emp_employees表中的每個雇員,我需要獲取tsr_cpo字段的總和(sum(RECAP.tsr_cpo),其中EMP.id = RECAP.tsr_id)。 對於驗證銷售的任何人,我還需要獲取ver_cpo的總和(sum(RECAP.ver_cpo),其中EMP.id = RECAP.ver_id)。

我仔細考慮了您的問題,並同意維持一堆UNION查詢來創建上述“所需結果”似乎非常昂貴且困難。

編輯12-14-2017:根據您對我的回答的評論,我在下面進行了一些更改。

我認為可以通過兩個非常簡單的查詢來完成。 第一個查詢名為qry_Comms ,具有以下SQL代碼:

SELECT x_recap.sale_date, emp_employees.location_id, emp_employees.id, emp_employees.first_name, Sum(x_recap.tsr_cpo) AS tsr_comm, 0 AS ver_comm
FROM x_recap INNER JOIN emp_employees ON x_recap.tsr_id = emp_employees.id
GROUP BY x_recap.sale_date, emp_employees.location_id, emp_employees.id, emp_employees.first_name, 0
UNION ALL 
SELECT x_recap.sale_date, emp_employees.location_id, emp_employees.id, emp_employees.first_name, 0 AS tsr_comm, Sum(x_recap.ver_cpo) AS ver_comm
FROM x_recap INNER JOIN emp_employees ON x_recap.ver_id = emp_employees.id
GROUP BY x_recap.sale_date, emp_employees.location_id, emp_employees.id, emp_employees.first_name, 0;

然后第二個查詢名為qry_TotalComms ,具有以下SQL代碼:

SELECT qry_Comms.sale_date, qry_Comms.location_id, qry_Comms.first_name, Sum(qry_Comms.tsr_comm) AS SumOftsr_comm, Sum(qry_Comms.ver_comm) AS SumOfver_comm
FROM qry_Comms
GROUP BY qry_Comms.sale_date, qry_Comms.location_id, qry_Comms.first_name, qry_Comms.id;

qry_Comms查詢是獲取所有所需數據的基礎查詢,第二個查詢qry_TotalComms應該將所有數據正確組合在一起。 因此,您要做的就是將這兩個查詢都保存在Access數據庫中,然后運行qry_TotalComms查詢。 我認為,應該按照上面的“所需結果”表(以及您對我的原始答案的評論)提供正確的結果。

另外,如果這些查詢仍不能足夠快地執行,請嘗試對qry_Comms查詢使用MS Access“直通”查詢,這是可以在“查詢設計”功能區菜單上選擇的MS Access查詢類型之一。 訪問“通過”查詢將SQL代碼直接發送到數據庫服務器,並讓服務器進行處理,並僅返回結果記錄集。 實際上,所有其他類型的Access查詢都將本地復制表數據,然后在本地創建結果數據集,如果要處理大表,這可能會很慢且很昂貴。 因此,當將MySQL或SQL Server與Access一起使用時,“傳遞”查詢可以大大提高Access應用程序的性能。

最后,您還可以在MySQL數據庫上創建我作為視圖提供的上述查詢,然后直接從Access調用qry_TotalComms視圖。 這將是可能改善我上面給出的查詢性能的第二種選擇。

無論如何,我希望這些信息能對您有所幫助,但是如果您對此有任何疑問,請告訴我,我們將盡力幫助解決該問題!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM