2017-03-09 59 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