为什么MySQL LEFT JOIN不返回所有行,除非存在WHERE子句-phpMyAdmin问题

为什么MySQL LEFT JOIN不返回所有行,除非存在WHERE子句-phpMyAdmin问题,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,考虑以下几点: eventTypes表有163行 事件有43000行 SELECT events.eventTypeID, eventTypes.eventTypeName FROM events LEFT JOIN eventTypes ON events.eventTypeID = eventTypes.eventTypeID 这将返回163行。但是,如果我添加“WHERE events.eventID>=0” 我有43000行。我希望缺少WHERE条款会给我带来一切。我想错了吗 更新

考虑以下几点:

eventTypes表有163行

事件有43000行

SELECT events.eventTypeID, eventTypes.eventTypeName 
FROM events 
LEFT JOIN eventTypes ON events.eventTypeID = eventTypes.eventTypeID
这将返回163行。但是,如果我添加“WHERE events.eventID>=0”

我有43000行。我希望缺少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在两个查询中给出相同的输出(即,有或没有,其中1=1)

更新#3在第三个系统上进行测试会产生我预期的结果,尽管我不知道为什么。第三个系统是另一个运行MySQL 5.1.69的CentOS6。我从我的开发系统导入了完全相同的转储文件,而我导入的第二个测试系统没有产生正确的结果


更新#4发现问题。这不是MySQL的问题。这是一个phpMyAdmin问题。使用mysql客户端在命令行上进行测试时,我在所有系统上都得到了正确的结果。我在SqlFiddle上尝试了这一点:

我得到了预期的20排

SELECT events.eventTypeID, eventTypes.eventTypeName 
FROM events 
LEFT JOIN eventTypes ON events.eventTypeID = eventTypes.eventTypeID 
WHERE events.eventID >= 0
因为如果您提到(events.eventID>=0),这意味着获取所有这些行,它们的此条件为true,事件表中有43000行,所有行的条件为true,并且您使用左连接,因此获得43000行

I would expect the lack of a WHERE clause would give me everything. 
Am I thinking about this wrong?
是的,您是对的您的第一个查询是正确的,它应该返回您所期望的内容。 您正在使用
左外部联接
,这意味着左表中的所有记录和右表中的匹配记录

据我所知,这个问题与MYSQL版本无关


我的建议是,请检查要加入这两个表的关系(外键和主键)。

1=1时的
给出了什么?:)你的问题有点不对劲。您不能添加
where
子句并获取更多行。@霍布斯,其中1=1也适用。@GordonLinoff-Linoff我同意,但您正在查看确切的查询。我保证所发生的一切都是真实的。您的第二个查询是生成正确结果的查询-这毕竟是您正在使用的
左连接。我的猜测是,关于表/索引的一些事情正在导致优化器行为滑稽(即,考虑为<代码>内部连接< /代码>)。因此,您的
WHERE
子句使优化器意识到“伙计,他真的是这个意思”。所以,这并不是因为
WHERE
子句给了你更多的结果,而是由于某种原因,情况的某些方面给了你更少的结果。我将你的代码加载到我的数据库中,并尝试了它,它在我的系统上也对我有效。现在想知道我的情况有什么特别之处…你的系统的输出是什么?如果只有5行,哪5行?我尽力将我的结构和一些数据复制到sqlfiddle,并保持在8000个字符的限制内。我确实成功地完成了一个测试,它在SQLFIDLE上确实正常工作。所以,我的系统有些奇怪。接下来,我想在第三台服务器上尝试完整的数据集。MySQL的版本是什么?Linux还是Windows?你能删除并重新安装MySQL吗?我已经用MySQL版本5.5.29和5.1.61尝试过了。一个在Mac上运行的山狮与MAMP(开发系统)。另一个在CentOS6服务器上。
create table event (id int,type_id int);
create table type (type_id int, type_name varchar(30));

insert into type values(1, 'type 1');
insert into type values(2, 'type 2');
insert into type values(3, 'type 3');
insert into type values(4, 'type 4');
insert into type values(5, 'type 5');

insert into event values( 1,1);
insert into event values( 2,1);
insert into event values( 3,1);
insert into event values( 4,1);
insert into event values( 5,2);
insert into event values( 6,2);
insert into event values( 7,2);
insert into event values( 8,2);
insert into event values( 9,3);
insert into event values(10,3);
insert into event values(11,3);
insert into event values(12,3);
insert into event values(13,4);
insert into event values(14,4);
insert into event values(15,4);
insert into event values(16,4);
insert into event values(17,5);
insert into event values(18,5);
insert into event values(19,5);
insert into event values(20,5);

select event.id, type.type_name from event left join type
on event.type_id=type.type_id
SELECT events.eventTypeID, eventTypes.eventTypeName 
FROM events 
LEFT JOIN eventTypes ON events.eventTypeID = eventTypes.eventTypeID 
WHERE events.eventID >= 0
I would expect the lack of a WHERE clause would give me everything. 
Am I thinking about this wrong?