gpt4 book ai didi

mysql - SQL 通过带有 where 或子句的连接表进行选择

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:29 25 4
gpt4 key购买 nike

两个表:

tasks - id, creator_id (rest not relevant)

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

这可能吗?

谢谢。

最佳答案

常规加入将起作用。您想要将条件更改为 :

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 创建的请求,我建议使用 having 子句:

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;

这使得在您想要修改条件时更加灵活。例如,如果您想要所有标签或至少两个标签。

关于mysql - SQL 通过带有 where 或子句的连接表进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17072756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com