美好的一天,我似乎无法弄清楚如何做到这一点。我将首先解释我的数据库模型:
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的用户,但它们是在用户顶部还是其他作业中,或者在这两个表之间划分无关紧要。
因此,如果符合以下条件,则必须返回用户:
输入ID的数量可以增长并且没有限制。它必须始终匹配所有输入值。 编辑:因此,例如,如果我将job_ids 1和2以及3放入查询中,则ID 1 AND 2 AND 3需要位于该用户的顶部或其他表中。
有人可以帮我创建一个可以做到这一点的MySQL查询,并且不会对db-performance施加太大的压力吗?
先谢谢你帮助我!
答案 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
)
上测试
答案 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,并汇总两个表的总和。因此,匹配总数(从顶部和其他部分组合)必须与我们正在寻找的工作数量相同。