繁体   English   中英

SQL从表1中选择一行加入表2中的多行

[英]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
);

REF : SQL 相当于 IN 运算符,它充当 AND 而不是 OR?

左连接非常有用。 你可以试试这个。

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.

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