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

2019-09-12 14:21:46 +08:00
 avk458

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


class A {
	private List<B> params;
}    

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

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

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

2577 次点击
所在节点    问与答
17 条回复
akira
2019-09-12 14:55:40 +08:00
类型问题?而且你的 in 的 sql 怎么写的
avk458
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
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
2019-09-12 15:47:08 +08:00
同意三楼,你这个描述。。看不懂啊。。
avk458
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
2019-09-12 16:00:28 +08:00
@avk458 你的意思是指,只有查询到子表里所有关联数据时,才应该查出对应的主表数据?
avk458
2019-09-12 16:02:16 +08:00
@alexk 对,只有 a.params 小于等于 authorityParams 时,a 才应该被查出来。
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
2019-09-12 16:55:15 +08:00
@gIrl1990 感谢感谢。
按照你的数据,条件如果是[1,2,3] a1 a2 都符合小于等于 auth 条件,如果 auth 条件是[1,2] 那么只有 a2 应该被查出来。
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
2019-09-12 17:06:36 +08:00
补充上一条,看错了,avk458 就是楼主。。那就按照 小于等于 的意思来
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
2019-09-12 17:20:30 +08:00
@gIrl1990 不是比较大小啦,id 是 uuid 怎么比。。。没表达太清,a.params 小于等于 auth.params 是条件包含目标,目标是条件的子集。
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
2019-09-12 17:50:07 +08:00
@gIrl1990 就是这个意思,如果有 a3 [1,2,3,4]就不满足条件
csusong
2019-09-12 18:06:35 +08:00
查出不在查询条件中的数据,排除掉,剩下的就是满足子集条件的数据了呀。
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 的话,也会查出来。大致结构已经出来了,你再接着调整就行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/600385

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX