我想返回一个结果集,其中列出包含第一位作者的所有书籍(每本书按字母顺序排列)。
我有一个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
事情搞砸了......:?
答案 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)