对于多个相关作者,如何在加入表时只显示一个

时间:2015-02-24 09:47:54

标签: sql group-by sql-order-by

我想返回一个结果集,其中列出包含第一位作者的所有书籍(每本书按字母顺序排列)。

我有一个SQL查询,可以按照图书作者姓名返回所有图书,作者和订单的联接,但是当我尝试按图书ID分组以删除重复内容时,这会失败...

SELECT
  ct.entry_id AS SKU,
  c.channel_title,
  ct.title, ct.status,
  bat.title AS author_title
FROM exp_store_products sp
JOIN exp_channel_titles ct ON ct.entry_id=sp.entry_id
LEFT JOIN exp_channels c ON c.channel_id=ct.channel_id
LEFT JOIN exp_playa_relationships pl ON pl.parent_entry_id=ct.entry_id
LEFT JOIN exp_channel_titles bat ON bat.entry_id=pl.child_entry_id
WHERE ct.channel_id IN(18,33,43)
ORDER BY bat.title

我是否必须运行子查询?如果我能避免它,我宁可不要,但

我不知道为什么要添加:

GROUP BY ct.entry_id
事情搞砸了......:?

2 个答案:

答案 0 :(得分:1)

你必须打破作者之间的联系才能选择“胜利者”; max()min()是两种简单的方法:

SELECT
  ct.entry_id AS SKU,
  c.channel_title,
  ct.title,
  ct.status,
  min(bat.title) AS author_title
FROM exp_store_products sp
JOIN exp_channel_titles ct ON ct.entry_id=sp.entry_id
LEFT JOIN exp_channels c ON c.channel_id=ct.channel_id
LEFT JOIN exp_playa_relationships pl ON pl.parent_entry_id=ct.entry_id
LEFT JOIN exp_channel_titles bat ON bat.entry_id=pl.child_entry_id
WHERE ct.channel_id IN(18,33,43)
GROUP BY ct.entry_id, c.channel_title, ct.title, ct.status

使用min()(如此处)将为您提供按字母顺序排列的名字。

答案 1 :(得分:0)

您可以尝试通过将作者标题逻辑移动到SELECT部分​​来避免处理分组/聚合。

如果您计划限制结果集(分页,延迟Feed),此解决方案比聚合更有效。在这种情况下,作者标题将仅针对可见行进行解析。

SELECT ct.entry_id AS SKU,
   c.channel_title, ct.title, ct.status,
   (
     SELECT bat.title
     FROM exp_channel_titles bat
     JOIN exp_playa_relationships pl ON bat.entry_id=pl.child_entry_id
     WHERE pl.parent_entry_id=ct.entry_id 
     ORDER BY bat.title
     LIMIT 1
   ) AS author_title
FROM exp_store_products sp
JOIN exp_channel_titles ct ON ct.entry_id=sp.entry_id
LEFT JOIN exp_channels c ON c.channel_id=ct.channel_id
WHERE ct.channel_id IN(18,33,43)