簡體   English   中英

將表格中的一行與多行聯接

[英]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.

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