Mysql获得带有两个左连接的唯一条目

时间:2012-06-15 01:54:03

标签: mysql expressionengine

我有以下mysql查询,它按类别生成条目列表。但是,生成的一些条目是重复的(重复的entry_id - 因为它们出现在多个类别中)。怎样才能确保没有重复?我试图使用GROUP BYDISTINCT的其他变体,但没有成功。谢谢。

SELECT ct.entry_id, ct.title, c.cat_name
FROM exp2_categories c
LEFT JOIN exp2_category_posts cp ON (cp.cat_id = c.cat_id)
LEFT JOIN exp2_channel_titles ct ON (ct.entry_id = cp.entry_id) 
WHERE c.group_id = '4' 
GROUP BY c.cat_id
ORDER BY ct.entry_date DESC

修改

第一个答案很棒,除了每个类别产生多个条目。每个类别我需要一个唯一的条目。对不起,我原来的问题应该更具体。

例如,它产生什么 - 条目是唯一的,但条目太多:

entry_id_1    Title 1    Category_1, Category_2
entry_id_3    Title 3    Category_2
entry_id_345  Title 345  Category_3
entry_id_123  Title 123  Category_4, Category_3, Category_1
entry_id_678  Title 678  Category_4

期望的结果 - 条目是唯一的,每个类别只有一个条目:

entry_id_1    Title 1    Category_1
entry_id_3    Title 3    Category_2
entry_id_345  Title 345  Category_3
entry_id_123  Title 123  Category_4

1 个答案:

答案 0 :(得分:1)

您获得“重复”的原因是您也在选择类别,因此如果条目属于多个类别,您将获得多行。

group_concat()聚合函数需要什么:

SELECT ct.entry_id, ct.title, group_concat(c.cat_name) as cat_names
FROM exp2_categories c
LEFT JOIN exp2_category_posts cp ON (cp.cat_id = c.cat_id)
LEFT JOIN exp2_channel_titles ct ON (ct.entry_id = cp.entry_id) 
WHERE c.group_id = '4' 
GROUP BY ct.entry_id, ct.title
ORDER BY ct.entry_date DESC

这将为每个条目创建一行,并使用逗号分隔的类别列表。