2015-02-24 30 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) 
相關問題