在我自己承诺之前,有人能解释一下吗?第一个结果集应该有两个结果,与第二个结果相同,没有?
mysql> SELECT * FROM kuru_footwear_2.customer_address_entity_varchar
-> WHERE attribute_id=31 AND entity_id=324134;
+----------+----------------+--------------+-----------+-------+
| value_id | entity_type_id | attribute_id | entity_id | value |
+----------+----------------+--------------+-----------+-------+
| 885263 | 2 | 31 | 324134 | NULL |
+----------+----------------+--------------+-----------+-------+
1 row in set (0.00 sec)
mysql> SELECT * FROM kuru_footwear_2.customer_address_entity_varchar
-> WHERE value_id=885263 OR value_id=950181;
+----------+----------------+--------------+-----------+-------+
| value_id | entity_type_id | attribute_id | entity_id | value |
+----------+----------------+--------------+-----------+-------+
| 885263 | 2 | 31 | 324134 | NULL |
| 950181 | 2 | 31 | 324134 | NULL |
+----------+----------------+--------------+-----------+-------+
2 rows in set (0.00 sec)
attribute_id是一个SMALLINT(5)
entity_id是INT(10)
答案 0 :(得分:1)
问题是您在(entity_id,attribute_id)
上有唯一索引。当您编写索引覆盖WHERE
子句的查询时,查询优化器会注意到这一点,并且只返回1行,因为索引的唯一性意味着最多只有一个匹配的行。
我不确定你是如何在第一时间拥有这些副本的,似乎表中存在损坏的东西。向表中添加唯一索引通常会删除任何重复项。事实上,这通常被建议作为摆脱表格中重复项的一种方式,请参阅How do I delete all the duplicate records in a MySQL table without temp tables。
答案 1 :(得分:-2)
在第一个语句的选择(' WHERE'子句)中,您正在使用AND
;在第二个声明中,您正在使用OR
。这归结为这些逻辑运算符的定义。除了AND
和OR
是他们自己的自然逻辑运算符之外,MySQL的官方文档并没有说太多。如果这令人困惑,您可能需要阅读基本的Boolean Algebra。