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, но я действительно не хочу идти по этому маршруту.
Спасибо за любую помощь!
Вы присоединяетесь к таблицам 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 миллиона строк! Хлоп!
Вам нужно добавить ключ, который вы соединяете, который существует в обеих таблицах, в предложение WHERE. Что-то вроде:
AND webcal_entry.user_id = webcal_entry_user.user_id
Вы делаете декартовое соединение. В принципе, для каждой строки в первой таблице вы объединяетесь со всеми строками во втором. Если первая таблица имеет 4 строки, а вторая 10, набор результатов будет иметь 40 (4x10)