比如,现在有下面这张表:
| id | pet | user |
|---|---|---|
| 1 | cat | userA |
| 2 | dog | userA |
| 3 | pig | userB |
| 4 | bird | userD |
怎么写SQL语句能选出下面的数据:
| id | pet | user |
|---|---|---|
| 1 | cat | userA |
| 3 | cat | userC |
其中, userA和userC是传递的参数。
我想实现的是, 求出多个用户共同喜欢那些宠物, 大神们, 帮帮忙吧, 我用的是Mysql数据库。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
第一想到的是子查询
若不是MySQL,我可能会这样做:
很遗憾的,MySQL并没有提供
INTERSECT和MINUS。仍然有很多办法来实现这一效果。
比如:
EXISTS
IN
或者说按题主要求的结构
SELECT
ID,PET,USER
FROM
TABLE
WHERE
PET IN (
SELECT
TB.PET
FROM
TABLE TB
GROUP BY
TB.PET
HAVING COUNT(TB.PET) >1
)
试一下吧
SELECT *
FROM tbl_pet
WHERE pet=(
SELECT pet
FROM tbl_pet p
WHERE USER IN('zhangsan','wangwu')
GROUP BY pet
HAVING COUNT(pet)>=2)
AND USER IN('zhangsan','wangwu')
最近正在做类似的功能:
常用的有两种方式
第一种: 子查询 => 思路 :
用in+and => 实现 :
不在举例
第二种: 利用求并集的方式 => 思路:
对查询结果 使用DISTINCT 去重
用求并集 UNION ALL
统计查询结果,只有当查询到的结果在每个查询语句里面都出现的话,才视为交集
举例:如果在n次查询中 查询到的结果 a 在每个查询语句中查询到的结果里面都出现过,则 a的出现次数m>n,但为了统计查询结果的准确性查询结果a至多只能在每个查询语句中出现一次,因此需要对每一个查询语句的结果进行去重,去重后a的出现次数为m,如果m=n,则意味a在n次查询中都有出现,即视为交集
=> 实现: