MySQL sorgusu arasında gereksiz sonuçları dönen

4 Cevap php
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'

Ben çalıştırdığınızda bu sorgu php geri atar:

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

Ben sonuçları sınırlamak zaman ben geri bazı 2,8 milyon sonuçları çekerek görüyoruz. Bu tablo 7241 satır var.

Ben GİBİ kullanabilirsiniz fark, ama gerçekten bu yolu gitmek istemiyorum.

Herhangi bir yardım için teşekkür ederiz!

4 Cevap

Sen FROM maddesinde webcal_entry ve webcal_entry_user tabloları katılıyor ancak herhangi bir JOIN ON yok ya {[(4)] } koşulları, satır webcal_entry_user dönmek için önleyici. Sonuç temelde geri geçerli bir cal_date, multiplied tarafından sahip her webcal_entry satır almak demektir iki tablonun kartezyen ürünü olacak webcal_entry_user tablodaki satır sayısı.

Eğer webcal_entry_user 400 satır vardır, diğer bir deyişle, geri 400 * 7241 alırsınız = 2.8 milyon satır! Eyvah!

Bir cartesian join yapıyoruz. Temelde, her satır için ilk tabloda size saniye içinde tüm satırları karşı katılmadan ediyoruz. İlk tablo 4 satır ve ikinci 10 varsa sonuç kümesi 40 (4x10) sahip olacaktır

Sen o WHERE yan tümcesi iki tablodaki var katılmadan konum anahtarı eklemek gerekiyor. Gibi bir şey:

AND   webcal_entry.user_id = webcal_entry_user.user_id