mysql - 如何使用SQL语句求出交集?
大家讲道理
大家讲道理 2017-04-17 11:52:02
[MySQL讨论组]

比如,现在有下面这张表:

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数据库。

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(6)
大家讲道理
SELECT 
    *
FROM
    `table` as `t1`
WHERE
    EXISTS( SELECT 
            *
        FROM
            `table` as `t2`
        WHERE
            `t1`.`id` = `t2`.`id`
                AND `id` IN ('userA' , 'userB'))
GROUP BY `pet`
HAVING COUNT(`pet`) = 2;
黄舟

第一想到的是子查询

select * from tb where pet in (select pet from tb where user = 'userA') and user = 'userC'
大家讲道理

若不是MySQL,我可能会这样做:

SELECT PET FROM TB_PET WHERE USER='userA'
    INTERSECT
SELECT PET FROM TB_PET WHERE USER='userC'

很遗憾的,MySQL并没有提供INTERSECTMINUS
仍然有很多办法来实现这一效果。

比如:

  • EXISTS

     SELECT PET FROM PET_A PET_USERA WHERE USER = 'userA' 
        AND EXISTS(SELECT PET FROM PET_A PET_USERC WHERE PET_USERC.USER = 'userC' AND                 PET_USERA.PET=PET_USERC.PET)
    
  • IN

    SELECT PET FROM PET_A WHERE USER = 'userA' AND PET IN (SELECT PET FROM PET_A WHERE USER = 'userC')
    
  • 或者说按题主要求的结构

    SELECT usera.* FROM PET_A usera 
        inner JOIN PET_A userc ON usera.PET = userc.PET
    WHERE usera.USER IN ( 'userA','userC') AND usera.`USER` <> userc.`USER` ORDER BY ID        
    
迷茫

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 => 实现 :
不在举例
第二种: 利用求并集的方式 => 思路:

  1. 对查询结果 使用DISTINCT 去重

  2. 用求并集 UNION ALL

  3. 统计查询结果,只有当查询到的结果在每个查询语句里面都出现的话,才视为交集

  4. 举例:如果在n次查询中 查询到的结果 a 在每个查询语句中查询到的结果里面都出现过,则 a的出现次数m>n,但为了统计查询结果的准确性查询结果a至多只能在每个查询语句中出现一次,因此需要对每一个查询语句的结果进行去重,去重后a的出现次数为m,如果m=n,则意味a在n次查询中都有出现,即视为交集
    => 实现:

SELECT
    table_id
FROM
    (
        SELECT DISTINCT
            table_id
        FROM
            table_front_item
        WHERE
            front_item_id = ?
        UNION ALL
            SELECT DISTINCT
                table_id
            FROM
                table_front_item
            WHERE
                front_item_id = ?
    ) a
GROUP BY
    table_id
HAVING
    COUNT(*) = 2
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号