MySQL между запросами, возвращающими избыточные результаты

0
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 миллиона результатов. Эта таблица имеет 7241 строку.

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

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

Теги:

3 ответа

5

Вы присоединяетесь к таблицам 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

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

AND   webcal_entry.user_id = webcal_entry_user.user_id
2

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню