[英]Mysql group_concat(id) as ids in a left join and using ids to select all columns in id group
我有一個表格,其中包含一些帶有其自己的ID和共享SKU密鑰的文章。 我試圖用左聯接進行查詢,並使用組結果獲取查詢返回的所有ID。
我的數據結構是這樣的:
id - name - sku - ...
1 - felix - cat
2 - tom - cat - ...
3 - sylvester - cat - ...
4 - red - pen - ...
5 - blue - pen - ...
我嘗試使用此查詢:
SELECT * FROM `test`
[LEFT/RIGHT/INNER] JOIN
(
SELECT GROUP_CONCAT(DISTINCT id) AS idsgroup FROM `test` WHERE (attribute_name = 'sku') GROUP BY value_name LIMIT 0, 3
) bind
ON id IN (bind.idsgroup);
該查詢是錯誤的,每個組僅返回1個ID,而不是從concat或LEFT JOIN情況下選擇的所有ID,顯然是所有行。
有任何建議解決方法可以達到正確的結果?
編輯:
這里的結構是一個小提琴: http : //sqlfiddle.com/#!9/b6747a
我嘗試的查詢:
SELECT * FROM `view_test`
INNER JOIN
(
SELECT GROUP_CONCAT(DISTINCT entity_id) AS idsgroup FROM `view_test` WHERE (attribute_name = 'sku') GROUP BY value_name LIMIT 0, 3
) bind
ON entity_id IN (bind.idsgroup);
編輯2:在我使用了Kickstart建議的FIND_IN_SET()之后,結果是預期的:
SELECT * FROM `view_test`
INNER JOIN
(
SELECT GROUP_CONCAT(DISTINCT entity_id) AS idsgroup FROM `view_test` WHERE (attribute_name = 'sku') GROUP BY value_name LIMIT 0, 3
) bind
ON FIND_IN_SET(entity_id, bind.idsgroup);
簡單的解決方法似乎是對聯接使用FIND_IN_SET。 但這是一個小技巧,並不會那么快。
SELECT *
FROM `view_test`
INNER JOIN
(
SELECT GROUP_CONCAT(DISTINCT entity_id) AS idsgroup
FROM `view_test`
WHERE (attribute_name = 'sku')
GROUP BY value_name
LIMIT 0, 3
) bind
ON FIND_IN_SET(entity_id, bind.idsgroup);
進一步不確定,為什么在子查詢上有一個LIMIT,尤其是沒有order子句的情況。
可能更好的方法是使用子查詢來獲得DISTINCT實體ID和sku的attribute_name並與之連接。
SELECT *
FROM `view_test`
INNER JOIN
(
SELECT DISTINCT entity_id
FROM `view_test`
WHERE (attribute_name = 'sku')
) bind
ON view_test.entity_id = bind.entity_id
像這樣嗎
SELECT t.*, group_concat(t2.id) FROM `test` t
LEFT JOIN test t2 ON t2.attribute_name = 'sku' and t.id != t2.id
group by t.id;
行,以及具有相同SKU的所有ID的列表
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.