Mysql查询加入表问题

时间:2017-01-21 19:45:24

标签: mysql

我需要帮助,我必须对加入表格有一些基本的误解。我有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'))

有人可以告诉我为什么不给我预期的结果?请解释一下发生了什么

2 个答案:

答案 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  |
+--------+--------+--------+