- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
VK приобрела 70% в структуре компании-разработчика red_mad_robot
Которая участвовала в создании RuStore
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Доброго времени суток. Столкнулся с необычной для меня траблой, не могу её грамотно победить. Суть следующая, есть запрос:
SELECT p.product_id,
(SELECT AVG(rating) AS total FROM c_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating,
p.price as price,
(SELECT price FROM c_product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount,
(SELECT price FROM c_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special
FROM c_product_to_category p2c LEFT JOIN c_product p ON (p2c.product_id = p.product_id) LEFT JOIN c_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN c_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND p2c.category_id = '60' AND p.product_id IN(42) GROUP BY p.product_id ORDER BY rating DESC, LCASE(pd.name) DESC LIMIT 0,15
Получаем часть характеристик через вложенные запросы. Нужно к этому значению достучатся и сделать дополнительные проверки в WHERE. Беда в том, что полученный и обьявленный через AS результат для столбца недоступен в WHERE, это фича mysql. Конкретно в моем случае, нужно сделать часть проверок для special, такого плана
Пытался это дело сделать через пользовательские переменные, почему-то не получилось, если кто-то покажет рабочий пример - буду очень признателен. Второй вариант, более грубый и менее практичный, завести отдельное поле в таблице и перед выборкой делать апдейт для этого значения и селектить уже его, без вложенных запросов. Может кому ещё какие варианты в голову прийдут, было бы интересно. Спасибо
Без повторения всей конструкции это технически невозможно, т.к. WHERE происходит хронологически до SELECT.
http://stackoverflow.com/questions/356675/using-an-alias-in-a-where-clause
http://stackoverflow.com/questions/200200/can-you-use-an-alias-in-the-where-clause-in-mysql
Возможно, Вам поможет HAVING?
Возможно, Вам поможет HAVING?
Он помогает для "агрегативных" функций.
К "AS `field`" можно достучаться, запихнув его в ещё один вложенный подзапрос. Эффективность - под вопросом, но вариант работающий..
Либо JOIN-ить c результатом запроса (В данном случае, похоже, не особо подходящий вариант, но в общем выглядит примерно так:
Он помогает для "агрегативных" функций.
Уточню. Having позволяет добавить фильтр уже после "агрегативных" фунций, а не до, как в случае с WHERE.
Если в конкретном запросе, нет разницы, когда применять фильтр (до Group by или после), то можно попробывать использовать HAVING как вариант.
Еще как вариант: запихивать результат выборки во временную таблицу, и из нее уже делать выборку по условию. Вариант не самый трушный, особенно если в результате выборки 100500 строк, а с условием всего 5 строк.
Если дело происходит в скрипте, то почему условие не поставить уже в самом цикле PHP?
Доброго времени суток. Столкнулся с необычной для меня траблой, не могу её грамотно победить. Суть следующая, есть запрос:
Получаем часть характеристик через вложенные запросы. Нужно к этому значению достучатся и сделать дополнительные проверки в WHERE. Беда в том, что полученный и обьявленный через AS результат для столбца недоступен в WHERE, это фича mysql. Конкретно в моем случае, нужно сделать часть проверок для special, такого плана
Пытался это дело сделать через пользовательские переменные, почему-то не получилось, если кто-то покажет рабочий пример - буду очень признателен. Второй вариант, более грубый и менее практичный, завести отдельное поле в таблице и перед выборкой делать апдейт для этого значения и селектить уже его, без вложенных запросов. Может кому ещё какие варианты в голову прийдут, было бы интересно. Спасибо
Судя по монстряческим запросам похоже на битрикс, если оно, то Вас могут спасти инфоблоки 2.0 ихние.
Если не битрикс, то в целом отдельное поле в таблице это как раз наиболее простой и правильный способ - по сути это кэширование, не только упрощающее, но и ускоряющее работу.
Всем большое спасибо, помогло завернуть запрос в ещё один запрос, сделав его весь вложенным. Не знал такого финта ушами :) По поводу временных таблиц - думал, при наличии 1500+ товаров не самый лучший вариант, но все же лучше чем доп. поле и его апдейт перед выборкой. Что касательно доп поля в таблице, special зависит от группы пользователя, текущей даты и т.д. В общем, его всегда нужно обновлять перед запросом, что есть не правильно. Спасибо за направление, пошел дальше ваять :)