@ElijahAysin

Как написать сложный SQL запрос?

Нужно отсортировать товары в таблице, по характеристикам в другой таблице.

Вот что примерно вышло:
SELECT content.id, content.pagetitle, content.parent, tv.id, tv.tmplvarid, tv.contentid, tv.value FROM modx_site_content AS content RIGHT JOIN modx_site_tmplvar_contentvalues AS tv ON content.id = tv.contentid and tv.tmplvarid = 20 and tv.value = 4 or content.id = tv.contentid and tv.tmplvarid = 20 and tv.value = 6 or content.id = tv.contentid and tv.tmplvarid = 19 and tv.value = 10 WHERE parent = 22923
ORDER BY `content`.`id` ASC

Проблема в сортировки, как можно проверить равен ли товар выбранным параметром?
a31ce23797334f97b6127f1c56188a7b.jpg
  • Вопрос задан
  • 277 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Oraclist
Вопрос не понятен от слова совсем.

Сразу скажу.
Несмотря на то, что условия пишутся одинаково, необходимо разделять условия связи двух таблиц и условия фильтрации/отбора. Логически условия отбора фильтруют итоговый массив строк, полученный после связывания всех таблиц. Технически фильтрация может выполняться раньше.
Т.о. условия связи в данной задаче надо оставить под инструкцией ON, а условия фильтрации вынести в инструкцию WHERE.

И да, (совет №1) не забывайте писать алиас таблицы перед именем поля, даже если в другой таблице такого поля нет. Ведь завтра оно может там появиться и код работать не будет. Научитесь (совет №2) придумывать короткие алиасы к таблица. А лучше систему получения коротких алиасов. Это пригодится в будущем, когда количество таблиц в системе и в запросе станет увеличиваться.

Возможно, я неправильно предположил суть вопроса, но должно получиться что-то похожее на
SELECT
	c.id
  , c.pagetitle
  , c.parent
  , tv.id
  , tv.tmplvarid
  , tv.contentid
  , tv.value 
FROM modx_site_content AS c 
RIGHT JOIN modx_site_tmplvar_contentvalues AS tv ON c.id = tv.contentid
WHERE c.parent = 22923
  AND ( tv.tmplvarid, tv.value ) IN ( ( 20, 4 ), ( 20, 6 ), ( 19, 10 ) )
ORDER BY c.id ASC


И последнее. Мне на 99% кажется, что исходя из имен таблиц, здесь должен быть не RIGHT, а LEFT JOIN.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы