首页 / MYSQL / mysql-在关系数据库中查询集合
mysql-在关系数据库中查询集合
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql-在关系数据库中查询集合,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3048字,纯文字阅读大概需要5分钟。
内容图文
![mysql-在关系数据库中查询集合](/upload/InfoBanner/zyjiaocheng/884/ca63198a20e749adb1f0c33ce5a4ff40.jpg)
我想查询关系数据库是否存在一组项目.
我正在建模的数据具有以下形式:
key1 = [ item1, item3, item5 ]
key2 = [ item2, item7 ]
key3 = [ item2, item3, item4, item5 ]
...
我将它们存储在具有以下架构的表中
CREATE TABLE sets (key INTEGER, item INTEGER);
因此,例如,以下插入语句将插入以上三组.
INSERT INTO sets VALUES ( key1, item1 );
INSERT INTO sets VALUES ( key1, item3 );
INSERT INTO sets VALUES ( key1, item5 );
INSERT INTO sets VALUES ( key2, item2 );
INSERT INTO sets VALUES ( key2, item7 );
INSERT INTO sets VALUES ( key3, item2 );
INSERT INTO sets VALUES ( key3, item3 );
INSERT INTO sets VALUES ( key3, item4 );
INSERT INTO sets VALUES ( key3, item5 );
给定一组项目,如果该集合存储在表中,我希望与该集合关联的键,如果不存储则为NULL.是否可以使用sql查询来做到这一点?如果是这样,请提供详细信息.
可能相关的详细信息:
>我主要对数据库设计/查询策略感兴趣,尽管我最终将在MySQL中实现此功能,并使用mysql-python包在python中执行查询.
>如果对于这种类型的查询更方便,则可以自由地重组数据库模式.
>每个集合(如果存在)应该是唯一的.
>我对部分比赛不感兴趣.
>数据库规模约为< 1000套,每套包含<每个项目10个,因此此时的性能不是优先事项.
提前致谢.
解决方法:
我不会评论是否有更合适的模式来执行此操作(这很可能),但是对于具有列名和项目的模式,以下查询应该可以工作. (mysql语法)
SELECT k.name
FROM (SELECT DISTINCT name FROM sets) AS k
INNER JOIN sets i1 ON (k.name = i1.name AND i1.item = 1)
INNER JOIN sets i2 ON (k.name = i2.name AND i2.item = 3)
INNER JOIN sets i3 ON (k.name = i3.name AND i3.item = 5)
LEFT JOIN sets ix ON (k.name = ix.name AND ix.item NOT IN (1, 3, 5))
WHERE ix.name IS NULL;
我们的想法是,所有的设置键都在k中,然后对要搜索的集合中的每个设置项,将它们与设置中的设置项数据连接一次,在这种情况下,三个键.具有表别名i1,i2和i3的三个内部联接中的每个联接都会过滤掉所有不包含用该联接搜索的项目的集合名.最后,我们用表别名ix的集合进行了左连接,该集合引入了集合中的所有其他项,即我们未搜索的每个项. ix.name为NULL,如果没有找到额外的项目,这正是我们想要的,因此是WHERE子句.如果找到集合,查询将返回包含集合键的行,否则将不返回任何行.
编辑:collapsars答案背后的想法似乎比我的要好得多,所以这里是带解释的简短版本.
SELECT sets.name
FROM sets
LEFT JOIN (
SELECT DISTINCT name
FROM sets
WHERE item NOT IN (1, 3, 5)
) s1
ON (sets.name = s1.name)
WHERE s1.name IS NULL
GROUP BY sets.name
HAVING COUNT(sets.item) = 3;
这里的想法是子查询s1选择所有包含我们要查找的项之外的项的键集.因此,当我们将连接集保留为s1时,当该集合仅包含要搜索的项时,s1.name为NULL.然后,我们按集合键进行分组,并过滤??出具有错误项目数的任何集合.然后,我们只剩下集合,这些集合仅包含我们要搜索的项,并且长度正确.由于集合只能包含一个项目一次,因此只有一个满足该条件的集合,这就是我们要寻找的集合.
编辑:这使我无所畏惧地做到了这一点.
SELECT totals.name
FROM (
SELECT name, COUNT(*) count
FROM sets
GROUP BY name
) totals
INNER JOIN (
SELECT name, COUNT(*) count
FROM sets
WHERE item IN (1, 3, 5)
GROUP BY name
) matches
ON (totals.name = matches.name)
WHERE totals.count = 3 AND matches.count = 3;
第一个子查询找到每个集合中项目的总数,第二个子查询找出每个集合中匹配项的数量.当matchs.count为3时,该集合具有我们要查找的所有项目,如果totals.count也为3,则该集合没有任何多余的项目.
内容总结
以上是互联网集市为您收集整理的mysql-在关系数据库中查询集合全部内容,希望文章能够帮你解决mysql-在关系数据库中查询集合所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。