MySQL GROUP BY不是空行

时间:2014-02-11 15:23:45

标签: mysql sql group-by

我有一个返回的查询:

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都会组合在一起。

2 个答案:

答案 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。