繁体   English   中英

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

[英]MySQL - How to select records that match all IN values but in 1 or more tables

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

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。现在,我要查询出同时匹配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查询吗?

预先感谢您在这里帮助我!

您可以将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};

您可以在表之间进行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);

试试这个查询:

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上进行测试

好吧,今天晚上这真是让人脑筋急转弯。 玩了一段时间,我想到了这个,它似乎起作用了。

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”表中的匹配项,并对两个表的总数求和。 因此,匹配的总数(从顶部到其他)必须与我们要查找的工作数相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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