MySQL-如何选择与所有IN值匹配但与1个或多个表匹配的记录

MySQL-如何选择与所有IN值匹配但与1个或多个表匹配的记录,mysql,Mysql,你好,我好像不知道怎么做。我将首先解释我的数据库模型: User (user_id, name) Job (job_id, name) UserTopJob (user_id, job_id) UserOtherJob(user_id, job_id) 用户可以设置他最喜欢的顶级工作。这些值将由用户id和作业id保存到UserTopJob中。用户还可以将他喜欢的其他一些作业设置到UserOtherJob中 现在,我想做的是查询出与我的求职输入匹配的用户。 例如,搜索输入为job_id 1和2。

你好,我好像不知道怎么做。我将首先解释我的数据库模型:

User (user_id, name)
Job (job_id, name)
UserTopJob (user_id, job_id)
UserOtherJob(user_id, job_id)
用户可以设置他最喜欢的顶级工作。这些值将由用户id和作业id保存到UserTopJob中。用户还可以将他喜欢的其他一些作业设置到UserOtherJob中

现在,我想做的是查询出与我的求职输入匹配的用户。 例如,搜索输入为job_id 1和2。 现在我想查询出与job_id 1和job_id 2都匹配的用户,但不管他们是在users top还是其他作业中,或者在这两个表之间划分

因此,如果出现以下情况,则必须返回用户:

  • 工单id 1和工单id 2均为顶级工单
  • 作业id 1和2都在其他作业中
  • 它们都有作业id 1和2,但在不同的表中
输入ID的数量可以增加,并且没有限制。它必须始终匹配所有输入值。 编辑:例如,如果我将作业ID 1、2和3放入查询中,则ID 1、2和3需要位于该用户的顶部或其他表中

有谁能帮我创建一个MySQL查询,它可以做到这一点,并且不会对数据库性能造成太大压力


提前谢谢你在这里帮助我

您可以使用
联合
进行此类工作

SELECT user_id AS user FROM UserTopJob where job_id in {job_ids}
UNION
SELECT user_id AS user FROM UserOtherJob where job_id in {job_ids};

您可以在表之间执行
联接
,以获得所需的结果,如

select u.name as user_name,
j.name as job_name
from `user` u
INNER join usertopjob utj on u.user_id = utj.user_id
inner join userotherjob uoj on u.user_id = uoj.user_id
inner join job j on j.job_id = utj.job_id or j.job_id = uoj.job_id 
where j.job_id in (1,2);
请尝试以下查询:

SELECT u.*
  FROM User u
  WHERE NOT EXISTS (
    SELECT 1
      FROM User u0
      JOIN Job j ON j.job_id IN (1,2) -- or other list of job ids
      LEFT JOIN UserTopJob utj ON utj.user_id = u0.user_id AND utj.job_id = j.job_id
      LEFT JOIN UserOtherJob uoj ON uoj.user_id = u0.user_id AND uoj.job_id = j.job_id
      WHERE u0.user_id = u.user_id
        AND utj.job_id IS NULL
        AND uoj.job_id IS NULL
  )

上进行测试好吧,今晚这是一场脑力激荡。玩了一段时间,我想出了这个,它似乎工作

SELECT user_id, SUM(matched) AS totalMatched FROM
(
    SELECT uoj.user_id, COUNT(uoj.job_id) AS matched FROM userOtherJob AS uoj 
    INNER JOIN user AS u ON u.user_id = uoj.user_id
    WHERE uoj.job_id IN (1,2)
    GROUP BY u.user_id

UNION ALL

    SELECT utj.user_id, COUNT(utj.job_id) AS matched FROM userTopJob AS utj 
    INNER JOIN user AS u ON u.user_id = utj.user_id
    WHERE utj.job_id IN (1,2)
    GROUP BY u.user_id
) AS t

GROUP BY user_id
HAVING totalMatched = 2

此查询统计“other”表中的匹配项,然后统计“top”表中的匹配项,并将两个表的总数相加。因此,匹配的总数(从顶部和其他组合)必须与我们正在寻找的作业数相同。

Hi Aminul,这不会解决我的问题,因为匹配传递了一个或多个值。它必须始终匹配所有传递的值。我认为最好是创建一个包含所有传递值的数组,然后在其中。。在里面将找到行。是的,这将匹配任何作业,因为IN检查1或2。但我需要匹配所有值1和2。嗨,拉胡尔,谢谢你的建议。但这并不匹配所有的工作。它将匹配作业1和2,但如果例如我将作业3(不在顶部或其他作业中)添加到in条件中,用户仍将被选中,因为它匹配1、2或3。但是我需要它来匹配1、2和3,在这种情况下,执行一个
内部连接
,以获得唯一的匹配结果。在查询中,将
LEFT JOIN
替换为
internal JOIN
。不幸的是,这没有任何区别,因为In仍然与(1,2,3)一起工作,而3不在top或其他作业中。由于1或2(或3-但不在其中)匹配,用户仍处于选中状态。请参阅答案中的编辑。我的意思是和作业表做一个内部连接。现在应该可以了。请尝试Rimas SQL fiddle并尝试将不存在的作业id添加到中,例如999。它仍然返回用户,但999不在这两个表中的任何一个表中。您好,Rimas,谢谢您的示例,但是如果我将例如作业999添加到in条件中,用户仍然返回,因为它匹配1或2,而不是1和2以及999。我需要它匹配所有值。添加到IN条件中的
job\u id
必须存在于
job
表中-这是此查询正常工作的要求。我理解您的意思,但即使添加现有job\u id,它仍然不匹配所有值。可能是因为IN对值执行OR检查,但我想我需要AND检查。因此,查询返回匹配所有作业的用户。至少不是1。请参见SQL FIDLE示例:查询返回用户1,2,因为每个用户都有作业1和作业2;并且查询不返回用户3和4,因为用户3只有作业1,用户4只有作业2;那怎么了?