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

时间:2014-10-18 19:24:22

标签: mysql

美好的一天,我似乎无法弄清楚如何做到这一点。我将首先解释我的数据库模型:

User (user_id, name)
Job (job_id, name)
UserTopJob (user_id, job_id)
UserOtherJob(user_id, job_id)

用户可以设置他最喜欢的顶级工作。这些值将由user_id和job_id保存到UserTopJob中。用户也可以将他喜欢的其他一些工作设置到UserOtherJob中。

现在,我想要查询匹配我的求职输入的用户。 例如,搜索输入是job_id 1和2。 现在我想查询匹配BOTH job_id 1和job_id 2的用户,但它们是在用户顶部还是其他作业中,或者在这两个表之间划分无关紧要。

因此,如果符合以下条件,则必须返回用户:

  • job_id 1& 2位于顶级职位
  • job_id 1& 2是其他工作
  • 他们同时拥有job_id 1和2,但在不同的表中

输入ID的数量可以增长并且没有限制。它必须始终匹配所有输入值。 编辑:因此,例如,如果我将job_ids 1和2以及3放入查询中,则ID 1 AND 2 AND 3需要位于该用户的顶部或其他表中。

有人可以帮我创建一个可以做到这一点的MySQL查询,并且不会对db-performance施加太大的压力吗?

先谢谢你帮助我!

4 个答案:

答案 0 :(得分:0)

您可以使用UNION进行此类工作。

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};

答案 1 :(得分:0)

您可以在表格之间执行JOIN以获得所需的结果,例如

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);

答案 2 :(得分:0)

尝试此查询:

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
  )

SQL Fiddle

上测试

答案 3 :(得分:0)

好吧,今晚这是一个大脑破坏者。用了一段时间来解决这个问题,我提出了这个问题,似乎有效。

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

此查询会对其他'中的匹配进行计数。表格,然后在' top' table,并汇总两个表的总和。因此,匹配总数(从顶部和其他部分组合)必须与我们正在寻找的工作数量相同。