簡體   English   中英

MySQL連接具有不同行號的多個表

[英]MySql join multiple tables with different rows number

對於標題可能令人困惑,我感到抱歉,但是我真的不知道如何很好地描述我的問題。 我也說英語,因為我不是母語人士。

假設我有以下架構:

 _________                               _________
| Table 1 |                             | Table 2 |
|---------|          ______     ________|---------|
| id_a    |___      | join |   |        | id_b    |
| name    |   |     |------|   |        | info    |
|_________|   |_____| id_a |___|        | data    |
                    | id_b |            |_________|
                    |______|

通過數據庫中的這些信息:

表格1 :

 _____________
| id_a | name |
|------|------|
|   1  | foo  |
|______|______|

表2:

 _____________________
| id_b | info | data  |
|------|------|-------|
|   1  | bar  | baz   |
|   2  | kux  | corge |
|   3  | fred | quux  |
|______|______|_______|

加盟:

 _____________
| id_a | id_b |
|------|------|
|   1  |   1  |
|   1  |   2  |
|   1  |   3  |
|______|______|

在數據庫中,我有其他與“ Join”類型相同的表。 它們用於存儲“表1” ID和其他表中的其他ID (我在架構中僅使用一個聯接表來簡化問題)

當我嘗試檢索所需的數據時,我首先使用了以下語法:

SELECT t1.*,
       t2.*
FROM table1 AS t1
LEFT JOIN join AS j
ON j.id_a = t1.id_a
LEFT JOIN table2 AS t2
ON t2.id_b = j.id_b
WHERE t1.id_a = ?

但是由於結果是一個包含多行的數組,而我只希望有一行,所以我嘗試使用GROUP_CONCAT

所以我的語法變成了:

SELECT t1.*,
       GROUP_CONCAT(t2.info SEPARATOR '|') AS info,
       GROUP_CONCAT(t2.data SEPARATOR '|') AS data
FROM table1 AS t1
LEFT JOIN join AS j
ON j.id_a = t1.id_a
LEFT JOIN table2 AS t2
ON t2.id_b = j.id_b
WHERE t1.id_a = ?
GROUP BY t1.id_a

現在它可以正常工作,並且返回單行。

現在的問題是,我將此原理與多個聯接一起使用,每個聯接返回的行數與其他聯接不同。 然后將串聯值復制,我可以得到如下結果:

arrray(
    [...]
    'info' => 'bar|bar|bar|bar|kux|kux|kux|kux|fred|fred|fred|fred|',
    'data' => 'baz|baz|baz|baz|corge|corge|corge|corge|corge|quux|quux|quux|quux'
)

因此,我想知道是否有一種方法可以避免重復的值,並且仍然可以在單個請求中檢索所需的數據?

給定您的數據,此查詢應返回您想要的內容:

SELECT t1.*,
       GROUP_CONCAT(t2.info SEPARATOR '|') AS info,
       GROUP_CONCAT(t2.data SEPARATOR '|') AS data
FROM table1 t1 LEFT JOIN
     join j
     ON j.id_a = t1.id_a LEFT JOIN
     table2 t2
     ON t2.id_b = j.id_b
WHERE t1.id_a = ?
GROUP BY t1.id_a;

如果需要,可以使用DISTINCT刪除重復項:

SELECT t1.*,
       GROUP_CONCAT(DISTINCT t2.info SEPARATOR '|') AS info,
       GROUP_CONCAT(DISTINCT t2.data SEPARATOR '|') AS data
FROM table1 t1 LEFT JOIN
     join j
     ON j.id_a = t1.id_a LEFT JOIN
     table2 t2
     ON t2.id_b = j.id_b
WHERE t1.id_a = ?
GROUP BY t1.id_a;

不過,通常情況下,修復查詢更好,這樣它就不會生成重復項。

暫無
暫無

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

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