2

次の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

編集:

最初の答えは素晴らしいですが、カテゴリごとに複数のエントリが生成されます。カテゴリごとに1つの一意のエントリが必要です。申し訳ありませんが、元の質問ではもっと具体的にすべきでした。

たとえば、生成されるもの-エントリは一意ですが、エントリが多すぎます。

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

望ましい結果-エントリは一意であり、カテゴリごとに1つのエントリのみがあります。

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
4

1 に答える 1

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

これにより、エントリごとに1つの行が作成され、そのカテゴリのコンマ区切りリストが作成されます。

于 2012-06-15T02:01:05.793 に答える