2015-02-24 40 views
0

我想返回一个结果集,列出包含第一个作者(按字母顺序排列的每本书)列的所有书籍。有多个相关作者,如何在加入表格时只显示一个

我有一个返回所有的书一个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

你不能只按一列进行分组,并保持原样。您需要对结果集中您不想汇总的每个列进行分组。 – Luaan 2015-02-24 09:51:13

+0

GROUP BY是一个好主意,将它与MIN(author_name)结合使用。按规则记住常规组:“如果指定了GROUP BY子句,则SELECT列表中的每个列引用都必须标识分组列或作为set函数的参数。” – jarlh 2015-02-24 09:51:54

回答

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()(这里)会给你的第一个字母命名。

+0

不应该是'ORDER BY min(bat.title)'? – 2015-02-24 09:59:30

+0

@实际上,不需要排序(我把它从查询的复制粘贴留下)。 min()函数完成所有工作。 – Bohemian 2015-02-24 11:39:18

+0

布里尔,工作一种享受 - 非常感谢这一点。 :) – 2015-02-24 12:56:14

0

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

如果您打算限制结果集(分页,惰性订阅),此解决方案比聚合更有效。在这种情况下,作者标题仅针对可见行进行解析。

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) 
相关问题