我有一个返回的查询:
uid | text | flag | nonuid | another_id
123 | "tree" | 1 | 176 | 7098
456 | "apple" | 1 | 321 | 9686
321 | "apple" | 0 | | 5675
847 | "tree" | 1 | 176 | 6456
993 | "car" | 1 | 332 | 9686
222 | "cat" | 0 | | 7098
913 | "car" | 0 | | 2301
176 | "tree" | 0 | | 6456
982 | "car" | 1 | 332 | 7098
332 | "car" | 0 | | 7321
uid: unique field for every record
text: not unique piece of text
flag: whenever this is a "repost" entry of another row
nonuid: uid of the original of the repost
another_id: process_id that created the entry
我需要“折叠此列表,以便nonuid
在列表中只出现一次。如果该字段为空,则没有重新发布,因此应显示整行。所以运行后”对“查询我应该看到像这样的列表:
uid | text | flag | nonuid | another_id: GROUP_CONCAT(another_id)
123 | "tree" | 1 | 176 | 7098,6456
456 | "apple" | 1 | 321 | 9686
321 | "apple" | 0 | | 5675
993 | "car" | 1 | 332 | 9686,7098
222 | "cat" | 0 | | 7098
993 | "car" | 0 | | 9686
176 | "tree" | 0 | | 6456
332 | "car" | 0 | | 7321
我可以GROUP BY
列出text
列表,但uid
332 和uid
222 有相同的文字虽然两者都不是转发 - 我应该保留原件和转贴。或者,我可以通过nonuid
崩溃,这也会失败,因为所有“空”的nonuid都会组合在一起。
答案 0 :(得分:2)
为什么不在所需的两列上使用GROUP BY
?
SELECT `text`, `nonuid`, GROUP_CONCAT( `another_id`)
FROM yourTable
GROUP BY `text`, `nonuid`;
<强> Example Fiddle 强>
你还没有指定,如何选择其他列,所以我在这里省略了
答案 1 :(得分:1)
在我看来,你想完成两个查询,一个包含所有原始条目(flag = 0)和第二个where flag = 1,然后由nonuid与group concat分组,这样你就可以了单独创建码,然后结合两个结果。
SELECT * FROM table WHERE FLAG = 0
UNION
SELECT min(uid),text,flag,nonuid,GROUP_CONCAT(another_ID)
FROM table WHERE flag = 1 GROUP BY nonuid
这里第二个查询中的min(uid)会给你第一个repost uid。我不认为您在分组中指定了您想要的uid。