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

With multiple related authors, how to display only one when joining on tables

我想要 return 一个结果集列出所有书籍,其中有一列包括第一作者(每本书按字母顺序排列)。

我有一个 SQL 查询 return 所有书籍,加入作者并按书籍作者姓名订购,但是当我尝试按书籍 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

把事情搞砸了...:?

您必须打破作者之间的联系才能选择 "winner"; 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()(如此处)将为您提供按字母顺序排列的名字。

您可以通过将 author-title 逻辑移动到 SELECT 部分来尝试避免处理 grouping/aggregation。

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

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)