MySQL между запросами, возвращающими избыточные результаты - PullRequest
0 голосов
/ 26 июня 2009
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

Когда я ограничиваю результаты, я вижу, что это возвращает 2,8 миллиона результатов назад. В этой таблице 7 241 строка.

Я понимаю, что могу использовать LIKE, но я действительно не хочу идти по этому пути.

Спасибо за любую помощь!

Ответы [ 3 ]

5 голосов
/ 26 июня 2009

Вы присоединяетесь к таблицам webcal_entry и webcal_entry_user в своем предложении FROM, но у вас нет условий JOIN ON или WHERE, ограничивающих, какие строки из webcal_entry_user возвращать. Результатом будет декартово произведение двух таблиц, что в основном означает, что вы получите обратно каждую webcal_entry строку, в которой есть действительные cal_date, , умноженные на количество строк в webcal_entry_user таблица.

Другими словами, если у вас webcal_entry_user 400 строк, вы получите 400 * 7241 = 2,8 миллиона строк! Хлоп!

2 голосов
/ 26 июня 2009

Вам нужно добавить ключ, к которому вы присоединяетесь, который существует в обеих таблицах, к предложению WHERE. Что-то вроде:

AND   webcal_entry.user_id = webcal_entry_user.user_id
2 голосов
/ 26 июня 2009

Вы делаете декартово соединение . По сути, для каждой строки в первой таблице вы объединяете все строки во второй таблице. Если в первой таблице 4 строки, а во второй 10 результирующий набор будет иметь 40 (4x10)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...