有多个相关作者,如何在加入表格时只显示一个
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)
我想要 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)