我有以下表格:
- 小工具
- 领域
- 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/