根据标记选择过滤更新并显示与每个更新相关的所有标记

时间:2017-03-09 05:48:06

标签: mysql

我有以下表格

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

1 个答案:

答案 0 :(得分: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`