[英]SQL selecting through a join table with a where or clause
两张桌子:
任务-ID,creator_id(其余不相关)
tag_tasks-tag_id,task_id
我想通过标签ID数组通过tag_tasks来抓取任务,但是也要抓取具有特定creator_id的任务。
这是我当前正在执行的语句(不起作用):
SELECT tasks.id, tasks.content
FROM `tasks`
JOIN tag_tasks ON tasks.id = tag_tasks.task_id
WHERE (
`tag_tasks`.`tag_id`
IN (1,2,3)
)
OR tasks.creator_id =1
GROUP BY tasks.id
ORDER BY `tasks`.`id` DESC
这将通过tag_tasks表返回所有任务,但忽略在我的联接表中没有记录的任务。
我想要的是一个可以执行以下操作的查询:
SELECT tasks.id, tasks.content
FROM `tasks`
JOIN tag_tasks ON tasks.id = tag_tasks.task_id
WHERE (
`tag_tasks`.`tag_id`
IN (1,2,3)
)
GROUP BY tasks.id
ORDER BY `tasks`.`id` DESC;
和
SELECT tasks.id, tasks.content
FROM tasks
WHERE tasks.creator_id =1
GROUP BY tasks.id
ORDER BY `tasks`.`id` DESC
LIMIT 0 , 30
这可能吗?
谢谢。
定期加入将起作用。 您想要将条件更改为or
:
SELECT tasks.id, tasks.content
FROM `tasks` left outer join
tag_tasks
ON tasks.id = tag_tasks.task_id
where `tag_tasks`.`tag_id` IN (1,2,3) or tasks.creator_id = 1
GROUP BY tasks.id
ORDER BY `tasks`.`id` DESC;
那得到了完整列表。 您最多可以将其限制为30。 您是否真的想要所有“ 1、2、3”标记以及创建者1中的其他30个标记,如最后两个查询所暗示的(但实际上未在问题中提及)?
编辑:
当我查看查询时,我看到您仅在任务级别上检索信息。 如果您正在寻找带有1、2或3标签或由1创建的问题,我建议使用hading子句:
SELECT tasks.id, tasks.content
FROM `tasks` left outer join
tag_tasks
ON tasks.id = tag_tasks.task_id
GROUP BY tasks.id
having tasks.creator_id = 1 or sum(tag_id in (1, 2, 3)) > 0
ORDER BY `tasks`.`id` DESC;
如果您要修改条件,这将使其更加灵活。 例如,如果您需要所有标签或至少两个标签。
请使用此:
SELECT tasks.id, tasks.content
FROM `tasks`
JOIN tag_tasks ON tasks.id = tag_tasks.task_id
WHERE (
`tag_tasks`.`tag_id`
IN (1,2,3)
OR tasks.creator_id =1
)
GROUP BY tasks.id
ORDER BY `tasks`.`id` DESC
这是解决我的问题的查询。 我只需要创建一个LEFT JOIN而不是一个JOIN子句:
SELECT tasks.*
FROM `tasks`
LEFT JOIN tag_tasks on tasks.id = tag_tasks.task_id
WHERE (tag_tasks.tag_id IN (517) OR creator_id = 658)
GROUP BY tasks.id
ORDER BY tasks.created_at DESC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.