MySQL выборка по нескольким условиям

Выборка из прижоиной таблицы

#1 13 марта 2020 в 13:41
Привет, всем!

Есть 3 таблицы!

Первая:
cars
id | Name
--------------
1 | BMW
2 | Audi
3 | Toyota
....
---------------

Вторая:
cars_param
id | Name
---------------------
1 |Купе
2 |Кабриолет
3 |Внедорожник
....
---------------------

Третья:
cars_param_bind (без ключа)
item_id | value
---------------------
1 | 3
1 | 1
2 | 3
2 | 2
....
---------------------

Делаю запрос к таблице CARS и хочу отсортировать только те марки, у которых параметры одновременно Купе и Внедорожник

То есть под запрос попадает только BMW, так как у него в таблице cars_param_bind есть параметры 1 и 3

Вот что есть:

  1. SELECT i.* FROM cars i
  2. LEFT JOIN cars_param_bind AS p ON p.item_id = i.id
  3. WHERE (p.value = '1') AND (p.value = '3')
  4. ORDER BY i.date_pub DESC
  5. LIMIT 0, 15
Но результаты не выдает, пишет не найдено по условию!

Помогите правильно сформировать запрос!
#2 13 марта 2020 в 14:48
  1. SELECT i.* FROM cars i
  2. LEFT JOIN cars_param_bind AS p ON p.item_id = i.id
  3. WHERE i.id IN
  4. (SELECT item_id FROM `cars_param_bind` WHERE VALUE = 3) AND i.id IN (SELECT item_id FROM `cars_param_bind` WHERE VALUE = 1)
  5. ORDER BY i.date_pub DESC
  6. LIMIT 0, 15
Выдаст:
id name
1 BMW
1 BMW
Если надо, чтобы выдавало одну строку:
  1. SELECT i.* FROM cars i
  2. LEFT JOIN cars_param_bind AS p ON p.item_id = i.id
  3. WHERE i.id IN
  4. (SELECT item_id FROM `cars_param_bind` WHERE VALUE = 3) AND i.id IN (SELECT item_id FROM `cars_param_bind` WHERE VALUE = 1)
  5. GROUP BY i.id ORDER BY i.date_pub DESC
  6. LIMIT 0, 15
#3 13 марта 2020 в 14:52



  1. SELECT i.* FROM cars i
  2. LEFT JOIN cars_param_bind as p ON p.item_id = i.id
  3. WHERE (p.value = '1') AND (p.value = '3')
  4. ORDER BY i.date_pub desc
  5. LIMIT 0, 15

Вадим Нарочный

В Вашем запросе, сами представьте, как может быть (p.value = '1') и (p.value = '3')
#4 13 марта 2020 в 15:11
Нашел такое решение:

  1. GROUP BY p.item_id HAVING COUNT(*) = 2
Жаль что в системе нет встроенного фильтра HAVING, буду думать как добавить к запросу, не внося изменения в системные файлы!
#5 13 марта 2020 в 15:21
Вадим Нарочный,
А просто сделать пару дополнительных полей в таблице cars никак?
#6 16 марта 2020 в 17:56

А просто сделать пару дополнительных полей в таблице cars никак ?

Ris
Не совсем понял какие именно поля, можно пример?
#7 16 марта 2020 в 20:08
Вадим Нарочный, не сочтите за дерзость, но я бы сделал такие таблицы
marks (марки авто: BMW ...)
models (модели)
types (типы авто: Купе ...)
и 2 таблицы связей:
марок с моделями
моделей и типов
#8 16 марта 2020 в 20:10

Вадим Нарочный, не сочтите за дерзость, но я бы сделал такие таблицы
marks (марки авто: BMW ...)
models (модели)
types (типы авто: Купе ...)
и 2 таблицы связей:
марок с моделями
моделей и типов

@IamB

Эта таблицы просто пример!
#9 16 марта 2020 в 20:11
Нужна реализация выборки по нескольким условиям одного столбца! Пока не нашел способ(
#10 16 марта 2020 в 20:15
Вадим Нарочный, если это пример, то это пример неудачного, на мой взгляд, проектирования БД. Вы так к цели не придёте.
#11 16 марта 2020 в 20:17

Вадим Нарочный, если это пример, то это пример неудачного, на мой взгляд, проектирования БД. Вы так к цели не придёте.

@IamB
Точно так же реализованы категории в iCMS 2, а разработчик далеко не глупый человек!!!
#12 16 марта 2020 в 20:22

Точно так же реализованы категории в iCMS 2

Вадим Нарочный
Ой ли?
#13 18 марта 2020 в 18:21

Ой ли?

@IamB

В чем заключается не удачность проектирования? Связь многие ко многим, через третью таблицу!
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.