繁体   English   中英

SQL通过带有where或子句的联接表选择

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM