【发布时间】:2014-02-14 21:54:15
【问题描述】:
考虑以下几点:
eventTypes 表有 163 行。
事件有 43,000 行。
SELECT events.eventTypeID, eventTypes.eventTypeName
FROM events
LEFT JOIN eventTypes ON events.eventTypeID = eventTypes.eventTypeID
这将返回 163 行。但是,如果我添加“WHERE events.eventID >= 0”
SELECT events.eventTypeID, eventTypes.eventTypeName
FROM events
LEFT JOIN eventTypes ON events.eventTypeID = eventTypes.eventTypeID
WHERE events.eventID >= 0
我得到了所有 43,000 行。我希望缺少 WHERE 子句会给我一切。我是不是想错了?
更新:我刚刚在另一台服务器上尝试过,结果相同。我复制并粘贴的确切查询是:
SELECT events.eventTypeID, eventTypes.eventTypeName FROM events LEFT JOIN eventTypes ON events.eventTypeID = eventTypes.eventTypeID
这只会返回前 163 条记录。 MySQL 版本为 5.5.29 和 5.1.61。我查看了错误列表,没有发现任何内容。
更新 #2:EXPLAIN 给出与任一查询相同的输出(即有或没有 WHERE 1=1)
mysql> EXPLAIN(SELECT events.eventTypeID, eventTypes.eventTypeName FROM events LEFT JOIN eventTypes ON events.eventTypeID = eventTypes.eventTypeID);
+----+-------------+------------+--------+---------------+-------------+---------+-------------------------------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+--------+---------------+-------------+---------+-------------------------------+-------+-------------+
| 1 | SIMPLE | events | index | NULL | eventTypeID | 4 | NULL | 37748 | Using index |
| 1 | SIMPLE | eventTypes | eq_ref | PRIMARY | PRIMARY | 4 | casefriend.events.eventTypeID | 1 | |
+----+-------------+------------+--------+---------------+-------------+---------+-------------------------------+-------+-------------+
Update#3 在第三个系统上进行测试会产生我期望的结果,尽管我不知道为什么。第三个系统是另一个运行 MySQL 5.1.69 的 CentOS6。我从我的开发系统中导入了准确的转储,这些转储导入到第二个测试系统中,但没有产生正确的结果。
Update#4 发现问题。这不是 MySQL 问题。这是一个 phpMyAdmin 问题。使用 mysql 客户端在命令行上进行测试时,我在所有系统上都得到了正确的结果。
【问题讨论】:
-
WHERE 1=1提供了什么? :) -
您的查询有问题。您不能添加
where子句并获得更多行。 -
@hobbs WHERE 1=1 也可以。
-
@GordonLinoff Linoff 我同意,但您正在查看确切的查询。我保证发生的事情是真的。
-
您的 second 查询是产生正确结果的查询 - 毕竟这是您使用的
LEFT JOIN。我的猜测是关于表/索引的某些东西导致优化器表现得很有趣(即,改为考虑INNER JOIN)。因此,您的WHERE子句使优化器意识到“伙计,他真的是这个意思”。所以并不是WHERE子句给了你更多的结果,而是由于某种原因,这种情况给你带来了更少的结果。
标签: mysql sql phpmyadmin