[英]Join one row from a table with multiple rows
這是有關mysql中查詢的問題。 例如,讓我們使用一個跟蹤汽車銷售的系統。 有一個帶salespersons
的表,一個sales
表和一個將兩者鏈接的表。 大多數情況下,每筆交易只有一個人與之相關。 但是有時會有多個人與一筆交易相關聯。
Table sales
id | carId | date
---+-------+-----------
1 | 2 | 11-01-2011
2 | 8 | 11-02-2011
3 | 5 | 11-05-2011
Table link
personId | saleId
---------+-------
2 | 1
2 | 2
1 | 3
2 | 3
Table salesperson
id | name | age
---+-------+----
1 | Barry | 25
2 | Sara | 32
要檢索數據,我想在網頁中顯示每筆交易的信息。 但是,當多個人與一項銷售相關聯時,就會出現問題。 我嘗試在代碼中應用下面的查詢,此后,PHP處理了多個人與一項銷售相關聯的異常,但是由於銷售表的長度,下面的查詢需要太多時間才能運行:
SELECT count(personId) as amount, carId, date
FROM link
JOIN salesperson ON link.personId = salesperson.id
JOIN sales ON sales.id = link.saleId
GROUP BY link.saleId
有沒有更有效的查詢可以使用? 順便說一下,表的索引已經完成。
然后就是:
SELECT STRAIGHT_JOIN
amount, carId, date
FROM (
SELECT saleId, count(*) as amount
FROM link
GROUP BY saleId
ORDER BY NULL) as amounts
JOIN sales ON sales.id = amounts.saleId;
您為表格設置了正確的索引嗎? 我不知道您的桌子有多大,但我無法想象這應該是一個很大的問題。
另外,您想從查詢中得到什么結果? 似乎您正在嘗試獲取所有銷售,然后計算涉及的銷售人員有多少?
您的查詢看起來還可以,但是您的分組依據有點奇怪...
嘗試按所有非聚合列進行分組的標准方法,如下所示:
SELECT carId, date, name, age, count(personId) as amount
FROM link
JOIN salesperson ON salesperson.id = link.personId
JOIN sales ON sales.id = link.saleId
GROUP BY 1,2,3,4;
我認為問題可能出在您使用鏈接表作為基表,而查詢的數據庫優化卻不好。 嘗試:
SELECT count(sp.personId) as amount, s.carId as carId, s.date as date, sp.name as name, sp.age as age
FROM sales as s
JOIN link as l ON s.id = l.saleId
JOIN salesperson as sp ON l.personId = sp.id
ORDER BY l.saleId
如果您關注性能方面,請避免使用Joins,尤其是在mysql中。 閱讀本文,了解有效的編碼技術, 網址為http://phpadvent.org/2011/a-stitch-in-time-saves-nine-by-paul-jones
對於您在第一個查詢中遇到的問題,請在第二個查詢中選擇銷售ID,從第三個查詢中的鏈接表中選擇personID,然后從人員表中選擇所有人員。
如本文所述,在傳遞查詢時使用IN子句。 它看起來很少冗長的編碼,但是比在具有15k +行的表上使用join效率更高
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.