首页 / MYSQL / mysql-选择多对多关系的另一面
mysql-选择多对多关系的另一面
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql-选择多对多关系的另一面,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3461字,纯文字阅读大概需要5分钟。
内容图文
![mysql-选择多对多关系的另一面](/upload/InfoBanner/zyjiaocheng/885/8dd746b77a6f4c3f917fe2c1fd0a2298.jpg)
背景
我有三个表:(SQL小提琴:http://sqlfiddle.com/#!2/f7b33/11)
产品展示
+----+-----------+
| id | product |
+----+-----------+
| 1 | product_1 |
| 2 | product_2 |
| 3 | product_3 |
+----+-----------+
产品_功能
+------------+------------+
| product_id | feature_id |
+------------+------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 2 | 1 |
| 2 | 3 |
| 3 | 4 |
+------------+------------+
特征
+----+-----------+
| id | feature |
+----+-----------+
| 1 | feature_1 |
| 2 | feature_2 |
| 3 | feature_3 |
| 4 | feature_4 |
+----+-----------+
然后,我选择像这样:
SELECT products.product,
GROUP_CONCAT(features.feature) AS features
FROM products
LEFT JOIN products_features
ON product_id = products.id
LEFT JOIN features
ON products_features.feature_id = features.id
GROUP BY products.id
得到类似的东西:
+-----------+-----------------------------------------+
| product | features |
+-----------+-----------------------------------------+
| product_1 | feature_1,feature_2,feature_3,feature_4 |
| product_2 | feature_1,feature_3 |
| product_3 | feature_4 |
+-----------+-----------------------------------------+
题
因此,一切都很棒,但是,我想做的就是只拥有具有feature_1和feature_3的东西,同时仍然获得其他功能.
换句话说,我想编写一个查询来获取我:
+-----------+-----------------------------------------+
| product | features |
+-----------+-----------------------------------------+
| product_1 | feature_1,feature_2,feature_3,feature_4 |
| product_2 | feature_1,feature_3 |
+-----------+-----------------------------------------+
我试过了:
SELECT products.product,
GROUP_CONCAT(features.feature) AS features
FROM products
LEFT JOIN products_features
ON product_id = products.id
RIGHT JOIN features
ON products_features.feature_id = features.id AND features.feature in ('feature_1','feature_3')
GROUP BY products.id
但是我当然知道:
+-----------+---------------------+
| product | features |
+-----------+---------------------+
| (null) | feature_4,feature_2 |
| product_1 | feature_1,feature_3 |
| product_2 | feature_3,feature_1 |
+-----------+---------------------+
因此,尽管我现在知道product_1和product_2是具有这些功能的产品,但是我看不到它们具有的其余功能.
什么查询将允许我指定feature_1和feature_3并得到以下响应?
+-----------+-----------------------------------------+
| product | features |
+-----------+-----------------------------------------+
| product_1 | feature_1,feature_2,feature_3,feature_4 |
| product_2 | feature_1,feature_3 |
+-----------+-----------------------------------------+
解决方法:
我认为最通用的方法是使用Have子句:
SELECT products.product,
GROUP_CONCAT(features.feature) AS features
FROM products
LEFT JOIN products_features
ON product_id = products.id
LEFT JOIN features
ON products_features.feature_id = features.id
GROUP BY products.id
HAVING sum(features.feature = 'feature_1') > 0 and
sum(features.feature = 'feature_3') > 0;
hading语句中的每个子句都在计算给定功能出现的次数.和要求两个功能都在最终结果集中.
编辑:
根据语句的结构,您还可以执行以下操作:
HAVING find_in_set('feature_1', features) > 0 and
find_in_set('feature_3', features) > 0;
之所以可行,是因为您正在生成包含功能列表的列,并且使用逗号作为该列表的分隔符.
内容总结
以上是互联网集市为您收集整理的mysql-选择多对多关系的另一面全部内容,希望文章能够帮你解决mysql-选择多对多关系的另一面所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。