Поисковая форма:) поиск по free-lance.ru Топ/история/обновления фриланса, по разным параметрам (темы, сообщения, пользователи...) Автоматическое удаление постов от ненужных юзеров в топике (php скрипт) Досье(точный ник)
 

Ник (или часть ника):
?
Какой текст ищем:
?
Раздел блогов:
За срок
дней
Тип поиска: (по вхождению: по тексту гуг выдаст посты с "гуг", "гугл", "огугл"; "полнотекстовый": по тексту "гуг" выдаст посты только с "гуг")
По вхождению строки:  Полнотекстовый: 
(поиск не 100% актуальный, есть определённая задержка при обновлении данных для поиска. )
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 Копия темы
>>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
0

©2008 edogs egods
Выразить восторг, поругаться
или предложить что-нибудь можно на форуме
Для обсуждения этого сервиса так же есть темы на фрилансе по
поиску , флудотопу ,и по удалённым сообщениям ,и по Актуальным/популярным темам , и по топу "кто кому больше наотвечал"