mysql查询选择多对多

标签 mysql

我有以下表格:

  • 小工具
  • 领域
  • Widgets_Fields

Widgets 表是一个简单的产品/列表表,带有 id、user_id、添加/更新等。

字段表列出了小部件的字段名称。可以有任意数量的字段(例如,高度、宽度、价格、年份、颜色等)。字段表:

  • 身份证
  • 姓名

每个小部件都可以有任意数量的字段和值与之关联。 Widgets_Fields 表将如下所示:

  • 身份证
  • field_id
  • widget_id
  • 值(value)

如果您只是想获取一个或一组小部件的所有字段,这非常简单:

select widget_id from widgets_fields where widget_id = xxx

但是,如果您正在搜索小部件并且只想查找那些字段具有特定值的小部件怎么办?也可行

select widget_id from widgets_fields where field_id = xxx and value = xxx

当我想根据多个字段选择小部件时,我的问题就出现了。例如,所有为“红色”或“橙色”且年份为 2012 或 2011 的小部件

select widget_id from widgets_fields where 
(field_id = xxx and (value = 'red' or value = 'orange')
and
(field_id = xxy and (value = 2012 or value = 2011)

这会产生一个不可能的位置。或者我可以做这样的事情

select widget_id from widgets_fields where
field_id in (xxx, xxy)
and value in ('red', 'orange', 2012, 2011)

但它不一定会返回我想要的内容,因为它会在任何提供的字段 ID 中查找给定的值。

最后,我的问题是是否有任何方法可以正确构建查询来完成此操作?我敢肯定肯定有,但我已经研究了一段时间,还没有想出解决方案。

最佳答案

all widgets that are either 'red' or 'orange' 
AND also have a year of 2012 or 2011

可以通过子查询和 INNER JOINing 结果一起完成

SELECT widget_id FROM
(SELECT widget_id FROM widgets_fields
WHERE field_id = 'color' and value in ('red', 'orange')) ResultSetA
INNER JOIN
(SELECT widget_id FROM widgets_fields
WHERE field_id = 'year' and value in (2011, 2012)) ResultSetB
ON ResultSetA.widget_id = ResultSetB.widget_id

简而言之,这将是“获取所有红色和橙色小部件的 ID,然后获取 2011 年或 2012 年的所有小部件的 ID,然后给我出现在两个列表中的 ID。

关于mysql查询选择多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11903784/

相关文章:

mysql - 从命令行连接时,用户访问被拒绝...

php - 使用 MySQL 数据库或文本文件中的数据安排电子邮件

mysql - ActiveRecord 资源的多个不同计数

mysql - 在 MySQL 中如何编写比子查询更好地连接两个表的 SQL?

mysql - 尝试通过以下方式将 sql 文件导入到远程数据库。程序

mysql - 连接到 MySQL 服务器无法正常工作

php - 页面加载错误codeigniter

mysql - 使用 memcache_functions_mysql UDF 处理 memcache 和 mysql

mysql将两列中的csv连接成 key 对

php - WordPress 问题 - 每次我登录管理员时,siteurl 和 home 选项都会更改