SQL запрос не работает?

Стоит задача, создание каталога с сортировкой товаров.
Столкнулся с такой проблемой, что если с одной группы а в данном примере это atributes.names и AND atributes.value нужно получить разные данные.
Составил SQL запрос, тот что ниже. Беда в том что как я понял нельзя с одной и тоже группы брать несколько значений типа следующего:
AND atributes.names = "Производитель" 
AND atributes.value IN ('ZOTAC','PALIT','ASUS') 
AND atributes.names = "Графический процессор"  
AND atributes.value IN ('nVidia GeForce GTX 660')

Так как мне выбрать эти значения, и что бы они были все обязательные, а не как в случаи с IN (value1,value2) где если нет value2 то он вернет value1.
Помогите составить sql запрос соответствующий вышеуказаным требованиям.

Сам полный запрос ниже.
SELECT * FROM `catalog` 
LEFT OUTER JOIN atributes ON catalog.art = atributes.art 
WHERE catalog.catalog_3 = "Видеокарты" 
AND catalog.price != "0" 
AND catalog.avail != "0" 
AND atributes.names = "Производитель" 
AND atributes.value IN ('ZOTAC','PALIT','ASUS') 
AND atributes.names = "Графический процессор"  
AND atributes.value IN ('nVidia GeForce GTX 660') 
ORDER BY price ASC LIMIT 0, 15
  • Вопрос задан
  • 2624 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT  * FROM `catalog` as `c` 
    INNER JOIN `atributes` AS `a1` ON `c`.`art` = `a1`.`art` 
    INNER JOIN `atributes` AS `a2` ON `c`.`art` = `a2`.`art` 
    WHERE `c`.`catalog_3` = "Видеокарты" 
        AND `c`.`price` != "0" 
        AND `c`.`avail` != "0" 
        AND `a1`.`names` = "Производитель" 
        AND `a1`.`value `IN ('ZOTAC','PALIT','ASUS') 
        AND `a2`.`names` = "Графический процессор"  
        AND `a2`.`value` IN ('nVidia GeForce GTX 660') 
        ORDER BY price ASC 
        LIMIT 0, 15

Но правильно выражать свои мысли на русском языке всё-таки научитесь, пригодится.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@VeMax
Кроме AND есть еще и OR и скобочки, которые указывают приоритет)
Ответ написан
Lerg
@Lerg
Defold, Corona, Lua, GameDev
Можно поставить OR между всеми атрибутами, затем результат сгруппировать по art, и в конечном итоге отображать только те товары, размер группы которых равен количеству атрибутов в поиске.
Может быть есть и какое-то более красивое решение

Ещё можно переделать базу. На каждый атрибут сделать свой столбец, при этом с ними всё ещё можно работать как с динамическими в том плане, что сделать достаточно большое количество столбцов с именами attr1, attr2, attr3 ... attr64 и в отдельной таблице хранить маппинг столбцов и атрибутов. Если для товара столбец NULL - не отображать его.

Кстати attribute пишется с двумя t.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
02 мая 2024, в 23:29
1500 руб./в час
02 мая 2024, в 23:16
7500 руб./за проект
15 апр. 2024, в 22:14
30000 руб./за проект