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

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

  •  
  •   avk458 Sep 12, 2019 3433 views
    This topic created in 2434 days ago, the information mentioned may be changed or developed.

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

     class A { private List<B> params; } 

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

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

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

    Supplement 1    Sep 12, 2019

    就是查询条件集合的子集,假设条件集合为 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 replies    2019-09-12 18:32:12 +08:00
    akira
        1
    akira  
       Sep 12, 2019
    类型问题?而且你的 in 的 sql 怎么写的
    avk458
        2
    avk458  
    OP
       Sep 12, 2019
    类似这样
    ```
    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  
       Sep 12, 2019
    没看懂。能不能列个 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  
       Sep 12, 2019
    同意三楼,你这个描述。。看不懂啊。。
    avk458
        5
    avk458  
    OP
       Sep 12, 2019
    @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  
       Sep 12, 2019
    @avk458 你的意思是指,只有查询到子表里所有关联数据时,才应该查出对应的主表数据?
    avk458
        7
    avk458  
    OP
       Sep 12, 2019
    @alexk 对,只有 a.params 小于等于 authorityParams 时,a 才应该被查出来。
    gIrl1990
        8
    gIrl1990  
       Sep 12, 2019
    @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
       Sep 12, 2019
    @gIrl1990 感谢感谢。
    按照你的数据,条件如果是[1,2,3] a1 a2 都符合小于等于 auth 条件,如果 auth 条件是[1,2] 那么只有 a2 应该被查出来。
    gIrl1990
        10
    gIrl1990  
       Sep 12, 2019
    @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  
       Sep 12, 2019
    补充上一条,看错了,avk458 就是楼主。。那就按照 小于等于 的意思来
    gIrl1990
        12
    gIrl1990  
       Sep 12, 2019
    @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
       Sep 12, 2019
    @gIrl1990 不是比较大小啦,id 是 uuid 怎么比。。。没表达太清,a.params 小于等于 auth.params 是条件包含目标,目标是条件的子集。
    gIrl1990
        14
    gIrl1990  
       Sep 12, 2019
    @avk458 我屮。好像明白了,你是说子集是吧。。
    - 条件 [1,2,3]
    - 那么表 B 中 aid=a1 [1, 2, 3] , 满足条件
    - 那么表 B 中 aid=a2 [1, 2],是条件的子集,也满足条件

    那我只能暂时只能说 “这个三角函数我不会,啪逃学威龙”
    avk458
        15
    avk458  
    OP
       Sep 12, 2019
    @gIrl1990 就是这个意思,如果有 a3 [1,2,3,4]就不满足条件
    csusong
        16
    csusong  
       Sep 12, 2019
    查出不在查询条件中的数据,排除掉,剩下的就是满足子集条件的数据了呀。
    gIrl1990
        17
    gIrl1990  
       Sep 12, 2019
    @avk458 对呀,根据楼上。
    select * from A where id not in (
    select aid from B where auth not in [1,2]
    ) ps: 如果 A 表还有 a3 的话,也会查出来。大致结构已经出来了,你再接着调整就行了
    About     Help     Advertise     Blog     API     FAQ     Solana     3450 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 67ms UTC 12:11 PVG 20:11 LAX 05:11 JFK 08:11
    Do have faith in what you're doing.
    ubao msn 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