V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
avk458
V2EX  ›  问与答

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

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

    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   ·   实用小工具   ·   1224 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:16 · PVG 02:16 · LAX 10:16 · JFK 13:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.