2017-03-09 28 views
0

我有以下表過濾器更新並顯示,涉及到每個更新所有標籤

updatestagsupdates_tags

我用下面的查詢基於選中的標籤,篩選出更新。

SELECT 
`updates`.`id` as `update_id`, 
`updates`.`body` as `update`, 
group_concat(DISTINCT `tags`.`title` ORDER BY `tags`.`title` ASC SEPARATOR ", ") AS tags 
FROM `updates` 
LEFT JOIN `updates_tags` ON `updates`.`id` = `updates_tags`.`update_id` 
LEFT JOIN `tags` ON `updates_tags`.`tag_id` = `tags`.`id` 
WHERE `updates_tags`.`tag_id` IN (?) #### <- FILTER #### 
GROUP BY `updates`.`id` 

我想,以保持過濾也有具有所有涉及到的更新標籤欄。可能與GROUP_CONCAT有關,或者我需要額外的JOIN

+0

見http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very -simple-sql-query – Strawberry

+0

我想我的問題是有效的。是的,我沒有數據集,但我的解釋足以讓某人明白我在問什麼。我得到了一個正確的答案。 – Ando

+0

由於沒有數據集和期望的結果l,我想我們永遠不會知道。 – Strawberry

回答

0

您的查詢看起來不錯。您只需要爲您的過濾器傳遞逗號分隔的標記ID列表。

SELECT 
    `u1`.`id` AS `update_id`, 
    `u1`.`body` AS `update`, 
    GROUP_CONCAT(DISTINCT `t1`.`title` ORDER BY `t1`.`title` ASC SEPARATOR ', ') AS `tags` 
FROM `updates` AS `u1` 
INNER JOIN `updates_tags` AS `ut1` ON (`u1`.`id` = `ut1`.`update_id`) 
INNER JOIN `tags` AS `t1` ON (`ut1`.`tag_id` = `t1`.`id`) 
INNER JOIN `updates_tags` AS `ut2` ON (`u1`.`id` = `ut2`.`update_id`) 
INNER JOIN `tags` AS `t2` ON (`ut2`.`tag_id` = `t2`.`id` AND `t2`.`id` IN (3, 4)) 
GROUP BY `u1`.`id` 
+0

我想要顯示具有所有標記ID的更新,而不僅僅是一個或多個,但基於標記ID的靜態過濾器。目前,如果我根據標籤id進行過濾(就像你做的那樣),我沒有得到與更新相關的所有標籤。 – Ando

+0

哦,我明白了。待機,我會更新我的答案。 – fubar

+0

@Ando - 已更新 – fubar