|
0 Всего найдено: 6
JonGol
Сообщение
01/03/2011 12:50
Копия темы
Помогите оптимизировать запрос Есть запрос вида. SELECT a.good_id,a.title,a.typesize, IF (a.typesize, (SELECT MIN(price)FROM `goods_size` WHERE good_id = a.good_id), a.price) AS `price` FROM goods a LEFT JOIN base_podcategory b ON a.podcat_id=b.podcat_id LEFT JOIN goods_size d ON a.good_id=d.good_id WHERE a.publication=1 AND b.cat_id=4 AND a.podcat_id=35 AND d.size IN (SELECT GROUP_CONCAT(DISTINCT US ORDER BY US ASC SEPARATOR ',') FROM base_brands_size_shoes WHERE CM IN ('21','21.5','22','22.5','23',' 23.5','24','24.5','25','25.5',' 26','26.5','27','27.5','27.75',' 28','28.5','29','29.5','30','30.5 ','31','31.5','32','32.5','33' ,'33.5','34','34.5') AND podcat_id=a.podcat_id) GROUP BY a.good_id HAVING `price`>0 AND `price` >=300 AND `price` BETWEEN 300 AND 7400 Вся проблема в том что необходимо искать по размерам обувь. И если человек выбрал размерную сетку "СМ" то нужно выбрать значение "US" , сообтетствующие выбраным "СМ" Таблица вида (на картинке) Данный запрос выполняется 4-5 секунд, из-за выбора размеров. Подскажите как можно оптимизировать. может промежуточную таблицу нужно сделать.
RiDDi
Сообщение
01/03/2011 13:14
Копия темы
чет у Вас тут такое страшное ) во-первых зачем GROUP_CONCAT? )) даже простой вложенный запрос будет быстрее потом нельзя взять какую-нибудь одну систему измерения размера а остальные просто переводить в неё? ну и в третьих что за `price`>0 AND `price` >=300 AND `price` BETWEEN 300 AND 7400 ?? :D и ON предпочтительнее WHERE в перекрестных запросах
JonGol
Сообщение
01/03/2011 13:23
Копия темы
дело в том что пользователь может выбрать как СМ так и US, а в основной таблице "goods_size" все хранится в US. Вот незнаю как брать значение US, согласно выбранным СМ из табилцы "base_brands_size_shoes". >> `price`>0 AND `price` >=300 AND `price` BETWEEN 300 AND 7400 ?? эт типа цена больше 0 > 300 и меньше 7400 а что не так, подскажи плиииз
RiDDi
Сообщение
01/03/2011 13:37
Копия темы
BETWEEN 300 AND 7400 уже подразумевает, что цена больше равно 300 и меньше равно 7400 `price`>0 AND `price` >=300 не надо ну как-то так ориентировочно SELECT a.good_id,a.title,a.typesize, d.`price` FROM goods a LEFT JOIN base_podcategory b ON a.podcat_id=b.podcat_id LEFT JOIN goods_size d ON a.good_id=d.good_id WHERE a.publication=1 AND b.cat_id=4 AND a.podcat_id=35 AND (SELECT id FROM base_brands_size_shoes WHERE us=d.size AND podcat_id=a.podcat_id) AND d.`price` BETWEEN 300 AND 7400 GROUP BY a.good_id то есть надо убрать GROUP_CONCAT и вместо него использовать простой вложенный запрос именно тут у Вас время уходит потом с ценой непонятно зачем два раза запрос из goods_size?
JonGol
Сообщение
01/03/2011 14:43
Копия темы
просто IF (a.typesize, (SELECT MIN(price) FROM `goods_size` WHERE good_id = a.good_id), a.price) AS `price` делаю из-за того что есть товар скажем ремень (где нету размеров и цена одна), а есть КЕДЫ (где много размеров и нужно выбрать минимальную только) поэтому делаю через "HAVING"
JonGol
Сообщение
01/03/2011 14:56
Копия темы
0
>>WHERE a.publication=1 AND b.cat_id=4 AND a.podcat_id=35 AND (SELECT id FROM base_brands_size_shoes WHERE us=d.size AND podcat_id=a.podcat_id) AND не понятна вот та запись еще. >>SELECT id FROM base_brands_size_shoes WHERE us=d.size AND podcat_id=a.podcat_id возращает же ROW>1 |
Выразить восторг, поругаться или предложить что-нибудь можно на форуме |
Для обсуждения этого сервиса так же есть темы на фрилансе по поиску , флудотопу ,и по удалённым сообщениям ,и по Актуальным/популярным темам , и по топу "кто кому больше наотвечал" |