MySQL之间的查询返回多余的结果

时间:2009-06-26 01:59:14

标签: php mysql

SELECT webcal_entry.cal_id, webcal_entry.cal_name , webcal_entry.cal_priority,
webcal_entry.cal_date , webcal_entry.cal_time , webcal_entry_user.cal_status,
webcal_entry.cal_create_by , webcal_entry.cal_access, webcal_entry.cal_duration ,
webcal_entry.cal_description , webcal_entry_user.cal_category 
FROM webcal_entry, webcal_entry_user
WHERE webcal_entry.cal_date BETWEEN '20090601' AND '20090631'

当我执行该查询时,php会抛出:

mysql_query(): unable to save result set
MySQL client ran out of memory

当我限制结果时,我发现它回收了大约280万个结果。该表有7,241行。

我意识到我可以使用LIKE,但我真的不想走那条路。

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

您正在加入webcal_entry子句中的webcal_entry_userFROM表,但您没有任何JOIN ONWHERE条件限制来自{的哪些行{1}}返回。结果将是两个表格的笛卡尔积,这基本上意味着您将获得具有有效webcal_entry_user乘以除行数的每个webcal_entry行在cal_date表中。

换句话说,如果webcal_entry_user有400行,你将获得400 * 7241 = 280万行!糟糕!

答案 1 :(得分:2)

你正在做cartesian join。基本上,对于第一个表中的每一行,您将加入第二个表中的所有行。如果第一个表有4行而第二个表10则结果集将有40(4x10)

答案 2 :(得分:2)

您需要将两个表中存在的密钥添加到WHERE子句中。类似的东西:

AND   webcal_entry.user_id = webcal_entry_user.user_id