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