非常奇怪的MySQL结果

时间:2017-02-15 22:09:57

标签: mysql

在我自己承诺之前,有人能解释一下吗?第一个结果集应该有两个结果,与第二个结果相同,没有?

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)

2 个答案:

答案 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。这归结为这些逻辑运算符的定义。除了ANDOR是他们自己的自然逻辑运算符之外,MySQL的官方文档并没有说太多。如果这令人困惑,您可能需要阅读基本的Boolean Algebra