我需要帮助,我必须对加入表格有一些基本的误解。我有3个表,' item',' property',' propvalues' 我试图列出颜色为黑色或灰色的项目,而形状是圆形的,例如。 (我的表格更复杂,我现在只是想让它变得简单。)
item
id category_id
1 1
2 1
3 2
4 3
property
id name
1 'shape'
2 'color'
propvalues
id property_id item_id value
1 1 1 'round'
2 2 1 'grey'
3 1 2 'round'
4 2 2 'black'
5 1 3 'square'
6 2 3 'black'
我有这个问题:
SELECT item.id FROM item
JOIN propvalues ON item.id=propvalues.item_id
WHERE item.category_id IN (1,2) &&
propvalues.value IN ('black','grey') AND propvalues.value IN ('round')
但这没有给我任何结果,而它应该输出项目ID 1和2 (因为它们都是圆的,其中一个是灰色的,另一个是黑色的。) (我还想在where子句中包含property_id,因为以后不同的属性可能具有相同的propvalues.value,所以实际上where子句看起来像这样:)
WHERE item.category_id IN(1,2) &&
(propvalues.property_id = 2 && propvalues.value IN ('black','grey')) &&
(propvalues.property_id = 1 && propvalues.value IN ('round'))
有人可以告诉我为什么不给我预期的结果?请解释一下发生了什么
答案 0 :(得分:0)
您有相互排斥的WHERE
条件:
propvalues.value IN ('black','grey') AND propvalues.value IN ('round')
相同的值不能同时为'round'
和而不是'round'
。你后面的例子也有同样的问题:
(propvalues.property_id = 2 && [...]) &&
(propvalues.property_id = 1 && [...])
相同的值不能同时为2
和 1
。
由于任何一条记录都不可能满足WHERE
条件,因此不会返回任何记录。
根据所需结果的说明,您可能希望在OR
条件分组之间使用AND
条件。像这样:
(propvalues.property_id = 2 AND propvalues.value IN ('black','grey')) OR
(propvalues.property_id = 1 AND propvalues.value IN ('round'))
答案 1 :(得分:0)
这里有几个基本想法......
DROP TABLE IF EXISTS eav;
CREATE TABLE eav
(entity INT NOT NULL
,attribute INT NOT NULL
,value VARCHAR(20) NOT NULL
,PRIMARY KEY(entity,attribute)
);
INSERT INTO eav VALUES
(1,1,'round'),
(1,2,'grey'),
(2,1,'round'),
(2,2,'black'),
(3,1,'square'),
(3,2,'black');
SELECT x.entity
, MAX(CASE WHEN x.attribute = 1 THEN x.value END) shape
, MAX(CASE WHEN x.attribute = 2 THEN x.value END) colour
FROM eav x
GROUP
BY x.entity
HAVING shape IN('round')
AND colour IN('black','grey');
+--------+-------+--------+
| entity | shape | colour |
+--------+-------+--------+
| 1 | round | grey |
| 2 | round | black |
+--------+-------+--------+
SELECT x.entity
, shape.value shape
, colour.value colour
FROM eav x
LEFT
JOIN eav shape
ON shape.entity = x.entity
AND shape.attribute = 1
LEFT
JOIN eav colour
ON colour.entity = x.entity
AND colour.attribute = 2;
+--------+--------+--------+
| entity | shape | colour |
+--------+--------+--------+
| 1 | round | grey |
| 1 | round | grey |
| 2 | round | black |
| 2 | round | black |
| 3 | square | black |
| 3 | square | black |
+--------+--------+--------+