[英]SQL select one row from table 1 joining on multiple rows in table 2
所以我有两个表,第一个是 users_
Name
------
Carol
Sue
第二个是兴趣_
Name Interest
----------------------
Carol Books
Carol Dancing
Carol Sports
Sue Books
Sue Dancing
用户将看到复选框以根据类似兴趣的标准选择匹配项
因此,如果用户选择书籍和舞蹈作为他们的比赛兴趣,我将构建什么类型的 sql 查询来组合多行兴趣并确保结果是 Sue,因为她的兴趣是书籍和舞蹈而不是体育?
任何帮助都会大有帮助,谢谢!
所以基本上要做到这一点,请建立一个负面列表,列出拥有超过这两个的用户,然后选择其他用户
SELECT u.name
FROM users_ u
JOIN interests_ i ON i.name = u.name
JOIN
( SELECT u.name
FROM users_ u
JOIN interests_ i ON i.name = u.name
WHERE i.interest NOT IN('Books', 'Dancing')
) t
WHERE u.name <> t.name
AND i.interest IN('Books', 'Dancing')
GROUP BY u.name
HAVING COUNT(u.name) = 2;
这是执行此操作的简单方法
select
i.name
from interests i
where i.interest in ('Books','Dancing')
and not exists
(
select 1 from interests i1
where interest not in ('Books','Dancing')
AND i.name = i1.name
)
group by i.name
having count(*) = 2
实现此结果的一种方法:
SELECT u.name
FROM users_ u
JOIN interests_ n01 ON n01.name = u.name AND n01.interest = 'Books'
JOIN interests_ n02 ON n02.name = u.name AND n02.interest = 'Dancing'
LEFT JOIN interests_ x01 ON x01.name = u.name AND x01.interest = 'Sports'
LEFT JOIN interests_ x02 ON x02.name = u.name AND x01.interest = 'Wine'
WHERE x01.name IS NULL
AND x02.name IS NULL
这种方法要求“包含”每个兴趣的 JOIN,以及“排除”每个兴趣的反联接。 这种方法是灵活的,但对于大量利益来说可能变得笨拙。
要仅查找指定兴趣的匹配项,而不必列出所有不匹配的兴趣,我们可以使用反联接查找不匹配的兴趣行:
SELECT u.name
FROM users_ u
JOIN interests_ n01 ON n01.name = u.name AND n01.interest = 'Books'
JOIN interests_ n02 ON n02.name = u.name AND n02.interest = 'Dancing'
LEFT
JOIN interests_ o
ON o.name = u.name
AND o.interest NOT IN ('Books','Dancing')
WHERE o.name IS NULL
另一种方法是利用 JOIN 操作和COUNT()
聚合,例如
SELECT u.name
FROM users_ u
JOIN interests_ n
ON n.name = u.name
AND n.interest IN ('Books','Dancing')
LEFT
JOIN interests_ o
ON o.name = u.name
AND o.interest NOT IN ('Books','Dancing')
WHERE o.name IS NULL
GROUP BY u.name
HAVING COUNT(DISTINCT n.interest) = 2
还有一些其他方法(这些只是一些示例)。
in
操作符中使用 SQL
select * from interests_ where Interest in ('Books', 'Dancing') and Interest not in ('Sports');
编辑 1
这对我有用
SELECT * FROM user_ WHERE EXISTS (
SELECT i.Name, count(distinct i.Interest) FROM interests_ as i
WHERE i.Name=user_.Name
AND i.Interest IN ('Books','Dancing')
GROUP BY i.Name
HAVING count(distinct i.Interest) = 2
);
左连接非常有用。 你可以试试这个。
SELECT users_.*
FROM users_
LEFT JOIN interests_
ON users_.Name = Interests_.Name
WHERE interests_.Interests = 'Books'
AND interests_.Interests = 'Dancing'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.