vitovt
@vitovt

Как составить запрос SQL для выборки записей по параметрам (2 таблицы)?

Есть две таблицы
1. Таблица записей
2. Таблица соответствий

В первой хранится информация вида:

id | title
------------
1 | Название 
2 | Название 2


Во второй таблице данные такие:

lot_id | param_id | param_value
-------------------------------------
1 | 1 | 36
1 | 2| 54

Т.е в первой хранится список объявлений во второй связь объявлений и атрибутов.

Т.е это могут быть "размер обуви" или "обхват груди" или "рост","сезон" и так далее. Каждый такой параметр во второй таблице - это paran_id его значение - param_value

Например мне нужно выбрать все вещи размером 36

SELECT lots.id, params.param_id FROM lots AS lots LEFT JOIN lots_params AS params ON lots.id=params.lot_id WHERE (params.param_id=1 AND params.param_value=36) LIMIT 5


Все хорошо, записи находятся

Но если мне надо выбрать все вещи размером 36 и ростом 54

SELECT lots.id, params.param_id FROM lots AS lots LEFT JOIN lots_params AS params ON lots.id=params.lot_id WHERE (params.param_id=1 AND params.param_value=36) AND (params.param_id=2 AND params.param_value=54) LIMIT 5


Не находит ничего. (Хотя данные в базе есть, есть одно объявление у которого две записи в таблице с param_id=1 и param_value=36, param_id=2 и param_value=54

Если поставить OR - срабатывает на ура, но нужно не ИЛИ а именно И условие.
  • Вопрос задан
  • 142 просмотра
Пригласить эксперта
Ответы на вопрос 2
@edb
SQL
select *
from lots l
where exists (select * from lots_params p 
                      where l.id = p.lot_id and p.param_id=1 AND p.param_value=36)

   and  exists (select * from lots_params p 
                       where l.id = p.lot_id and p.param_id=2 AND p.param_value=54)
Ответ написан
Комментировать
@SharuPoNemnogu
не язык плохой, программисты такие...
SELECT l.id, lp.param_id 
FROM lots AS l 
INNER JOIN lots_params AS lp ON l.id = lp.lot_id 
WHERE (lp.param_id = 1 AND lp.param_value = 36) OR
      (lp.param_id = 2 AND lp.param_value = 54)
GROUP BY l.id
HAVING COUNT(lp.param_id) = 2
LIMIT 5
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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