Написал запрос, аж комп завис))

SharuPoNemnogu

Вообщем вот какой запрос:
9 ответов

SharuPoNemnogu

SharuPoNemnogu,
SELECT img.folder, kuzov.*, dvig_mod.price, model.*, auto.*
FROM (img, kuzov, dvig_mod, model, auto)
 LEFT JOIN communication
 ON (img.id_img_folder = communication.id_img_folder 
 AND kuzov.id_kuzov = communication.id_kuzov 
 AND dvig_mod.id_dvig_mod = communication.id_dvig_mod 
 AND model.id_model = communication.id_model 
 AND auto.id_auto = communication.id_auto)
WHERE dvig_mod.privod = '$privod' AND kuzov.klass = '$klass' AND kuzov.name_kuzov LIKE '$kuzov'
от него все повисает нафиг)Напишите по грамотному плз.


SharuPoNemnogu

Опишите логику запроса словами.А еще лучше - приведите пример входных данных и желаемого результата.


SharuPoNemnogu

Напишите по-грамотному, пожалуйста.
да не вопрос PS. 1)оформите запрос с использованием тега [ src ] и не в одну строчку (и показывайте реально исполняемый запрос, а не пхпшную заготовку)2)покажите explain запросаЭто как минимум.


SharuPoNemnogu

Есть таблица communication в которой собственно хранятся связи (id других таблиц). Мне надо дернуть все авто по указанным в запросе таблицам, которые соответствуют условиям.Вот пример запроса с данными:
SELECT img.folder, kuzov . * , dvig_mod.price, model . * , auto . * 
FROM (
img, kuzov, dvig_mod, model, auto
)
LEFT JOIN communication ON ( img.id_img_folder = communication.id_img_folder
AND kuzov.id_kuzov = communication.id_kuzov
AND dvig_mod.id_dvig_mod = communication.id_dvig_mod
AND model.id_model = communication.id_model
AND auto.id_auto = communication.id_auto ) 
WHERE dvig_mod.privod = 'задний'
AND kuzov.klass = 'C'
AND kuzov.name_kuzov LIKE 'седан'


SharuPoNemnogu

(img, kuzov, dvig_mod, model, auto) - декарт?При том кол-ве строк в таблицах, что ты указал, такой декарт сгенерирует промежуточный датасет в размере:38 * 206 * 322 * 2198 * 2198 = 12177610101664 строкНе мудрено, что комп виснет... :)


SharuPoNemnogu

Добрый Э - Эх,Это я уже и сам понял. Как решить?


SharuPoNemnogu

SharuPoNemnogu, убрать нахрен скобки и запятые, переписать через JOIN, сделать нужные индексы. После чего смотреть на скорость, и если не понравится - explain в студию, будем разбираться дальше.кстати, "LIKE 'седан'" найдёт вам только 'седан' - вам точно нужен тут лайк или достаточно простого сравнения?


SharuPoNemnogu

..Как решить?
для начала
SELECT img.folder, kuzov.*, dvig_mod.price, model.*, auto.* 
FROM communication
inner join img on img.id_img_folder = communication.id_img_folder
inner join kuzov on kuzov.id_kuzov = communication.id_kuzov
inner join dvig_mod on dvig_mod.id_dvig_mod = communication.id_dvig_mod
inner join model on model.id_model = communication.id_model
inner join auto on auto.id_auto = communication.id_auto
WHERE dvig_mod.privod = 'задний'
 AND kuzov.klass = 'C'
 AND kuzov.name_kuzov = 'седан'
сразу предупреждаю - этот запрос не эквивалентен исходномуэто было нужно ?


SharuPoNemnogu

Заменил на JOIN все быстро отработало. Спасибо. И да мне нужен именно LIKE.