MySQL 有“全包含”的操作吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
avk458
V2EX    问与答

MySQL 有“全包含”的操作吗?

  •  
  •   avk458 2019-09-12 14:21:46 +08:00 3031 次点击
    这是一个创建于 2220 天前的主题,其中的信息可能已经有所发展或是发生改变。

    b 表作为 a 表的一对多子表,类似:

     class A { private List<B> params; } 

    现有List<B> authorityParams; {'111','222'}

    需要查询出,小于等于 authorityParams 的List<A>

    如果用 in 会查询出 a.params = {'111','222','333'} 这样的错误结果,求解

    第 1 条附言    2019-09-12 17:56:36 +08:00

    就是查询条件集合的子集,假设条件集合为 auth.params[11,22,33],数据有

    a1.params = [11,22,33,44] a2.params = [22,33] a3.params = [22,33,44] a4.params = [11,22,33] 

    只有a2、a4符合条件

    17 条回复    2019-09-12 18:32:12 +08:00
    akira
        1
    akira  
       2019-09-12 14:55:40 +08:00
    类型问题?而且你的 in 的 sql 怎么写的
    avk458
        2
    avk458  
    OP
       2019-09-12 15:18:52 +08:00
    类似这样
    ```
    select * from a left join b on a.id = b.obj_id where b.id in ('111','222') group by a.id;

    ```
    gIrl1990
        3
    gIrl1990  
       2019-09-12 15:44:32 +08:00
    没看懂。能不能列个 table
    比如 table A
    A 字段 1 A 字段 2
    A 值 11 A 值 21
    A 值 21 A 值 22

    table B
    B 字段 1 B 字段 2
    B 值 11 B 值 21
    B 值 21 B 值 22

    然后想要查出什么样的结果。
    akira
        4
    akira  
       2019-09-12 15:47:08 +08:00
    同意三楼,你这个描述。。看不懂啊。。
    avk458
        5
    avk458  
    OP
       2019-09-12 15:57:41 +08:00
    @gIrl1990
    +----------+ +-----------------+
    |id name | |id obj_id name |
    | ---------+ +-----------------+
    |1 a1 | |1 1 b1 |
    |2 a2 | |2 1 b2 |
    |3 a3 | |3 1 b3 |
    |4 a4 | |4 3 b4 |
    |5 a5 | |5 3 b5 |
    +----------+ +-----------------+
    如上有,a1.params = ['b1','b2','b3'];
    如果 authorityParams 为 1,2,3 的话,那么 a1 能被查出来,
    如果 authorityParams 为 1,2 的话,a1 不应该被查出来。
    alexk
        6
    alexk  
       2019-09-12 16:00:28 +08:00
    @avk458 你的意思是指,只有查询到子表里所有关联数据时,才应该查出对应的主表数据?
    avk458
        7
    avk458  
    OP
       2019-09-12 16:02:16 +08:00
    @alexk 对,只有 a.params 小于等于 authorityParams 时,a 才应该被查出来。
    gIrl1990
        8
    gIrl1990  
       2019-09-12 16:38:08 +08:00
    @avk458 为什么你那两个表是写在同一行的?还是没看懂。我来给你重新排版下吧。

    -----以下是表 A
    +----+
    | id |
    +----+
    | a1 |
    +----+
    | a2 |
    +----+

    ----以下是表 B
    +------+-----+
    | auth | aid |
    +------+-----+
    | 1 | a1 |
    +------+-----+
    | 2 | a1 |
    +------+-----+
    | 3 | a1 |
    +------+-----+
    | 1 | a2 |
    +------+-----+
    | 2 | a2 |
    +------+-----+

    ----以下是期望查询结果
    - 可以看到在表 B 中,aid=a1 的有 3 个[1, 2, 3], aid=a2 的只有 2 个[1, 2]
    - 条件是 auth=[1, 2, 3]
    - 然后就是说如果表 B 中是[1, 2, 3, 如果这里还有 4 的话]的话就查出这个 a1
    - [1, 2, 如果这里还有 4 的话] 不存在 3,所以不要查出 a2

    是不是这个查询意思?老哥。
    avk458
        9
    avk458  
    OP
       2019-09-12 16:55:15 +08:00
    @gIrl1990 感谢感谢。
    按照你的数据,条件如果是[1,2,3] a1 a2 都符合小于等于 auth 条件,如果 auth 条件是[1,2] 那么只有 a2 应该被查出来。
    gIrl1990
        10
    gIrl1990  
       2019-09-12 17:05:19 +08:00
    @avk458 不知道他的意思。他标题是全包含。。我以为他的意思是
    - 条件 [1,2,3]
    - 那么表 B 中 aid=a1 [1, 2, 3] , 满足条件
    - 那么表 B 中 aid=a2 [1, 2],没有 3,不满足条件

    然后你的 小于等于 又是另一个意思
    - 条件 2
    - 那么表 B 中 aid=a1 [1, 2, 3] , 3>2 不满足条件
    - 那么表 B 中 aid=a2 [1, 2],没有 3,满足条件
    gIrl1990
        11
    gIrl1990  
       2019-09-12 17:06:36 +08:00
    补充上一条,看错了,avk458 就是楼主。。那就按照 小于等于 的意思来
    gIrl1990
        12
    gIrl1990  
       2019-09-12 17:15:49 +08:00
    @avk458 是 小于等于 的话就没必要给出 a1.params = ['b1','b2','b3'] 或者 [1, 2, 3] 这样的条件了吧,有点误导 直接说条件是 最大值 3 不就好了嘛。

    那现在用条件是 最大值 2 来查询。按照我前面给出的结构。
    selec * from A join (select max(auth) _max, aid from B group by aid) B on A.id=B.aid
    where _max<=2; 对吗???
    avk458
        13
    avk458  
    OP
       2019-09-12 17:20:30 +08:00
    @gIrl1990 不是比较大小啦,id 是 uuid 怎么比。。。没表达太清,a.params 小于等于 auth.params 是条件包含目标,目标是条件的子集。
    gIrl1990
        14
    gIrl1990  
       2019-09-12 17:29:22 +08:00
    @avk458 我屮。好像明白了,你是说子集是吧。。
    - 条件 [1,2,3]
    - 那么表 B 中 aid=a1 [1, 2, 3] , 满足条件
    - 那么表 B 中 aid=a2 [1, 2],是条件的子集,也满足条件

    那我只能暂时只能说 “这个三角函数我不会,啪逃学威龙”
    avk458
        15
    avk458  
    OP
       2019-09-12 17:50:07 +08:00
    @gIrl1990 就是这个意思,如果有 a3 [1,2,3,4]就不满足条件
    csusong
        16
    csusong  
       2019-09-12 18:06:35 +08:00
    查出不在查询条件中的数据,排除掉,剩下的就是满足子集条件的数据了呀。
    gIrl1990
        17
    gIrl1990  
       2019-09-12 18:32:12 +08:00
    @avk458 对呀,根据楼上。
    select * from A where id not in (
    select aid from B where auth not in [1,2]
    ) ps: 如果 A 表还有 a3 的话,也会查出来。大致结构已经出来了,你再接着调整就行了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3080 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 11:02 PVG 19:02 LAX 04:02 JFK 07:02
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86