当前位置:  开发笔记 > 后端 > 正文

通过要求所有许多满足条件来过滤一对多查询

如何解决《通过要求所有许多满足条件来过滤一对多查询》经验,为你挑选了1个好方法。

想象一下下表:

创建表格框(id int,name text,...);

创建表thinginboxes(id int,box_id int,thing enum('apple,'banana','orange');

表格如下:

Boxes:
id | name
1  | orangesOnly
2  | orangesOnly2
3  | orangesBananas
4  | misc

thingsinboxes:
id | box_id | thing
1  |  1     | orange
2  |  1     | orange
3  |  2     | orange
4  |  3     | orange
5  |  3     | banana
6  |  4     | orange
7  |  4     | apple
8  |  4     | banana

如何选择包含至少一个橙色的盒子,而不包含任何不是橙色的盒子?

这个规模如何,假设我有数十万个盒子,可能有一百万个盒子?

如果可能的话,我想将这一切保留在SQL中,而不是使用脚本对结果集进行后处理.

我正在使用postgres和mysql,因此子查询可能很糟糕,因为mysql没有优化子查询(无论如何都是版本6).



1> Bill Karwin..:
SELECT b.*
FROM boxes b JOIN thingsinboxes t ON (b.id = t.box_id)
GROUP BY b.id
HAVING COUNT(DISTINCT t.thing) = 1 AND SUM(t.thing = 'orange') > 0;

这是另一个不使用GROUP BY的解决方案:

SELECT DISTINCT b.*
FROM boxes b
  JOIN thingsinboxes t1 
    ON (b.id = t1.box_id AND t1.thing = 'orange')
  LEFT OUTER JOIN thingsinboxes t2 
    ON (b.id = t2.box_id AND t2.thing != 'orange')
WHERE t2.box_id IS NULL;

与往常一样,在您对查询的可伸缩性或性能做出结论之前,您必须使用真实的数据集进行尝试,并测量性能.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有