Данный вопрос уже был задан и имеет решение:
Уже третий час ломаю голову как написать правильный запрос, но ничего не выходит.
Задача такая:
Есть таблица автомобилей
auto (автомобили)
id | name
-------------
1 | Volvo
2 | Audi
3 | Toyota
Есть таблица запчастей
spare (запчасти)
id | name
-------------
1 | Колеса
2 | Двигатель
3 | Руль
Есть many to many таблица для соединение запчастей и автомобилей
spare_to_auto
auto_id | spare_id
------------------
1 | 1
1 | 2
1 | 3
2 | 1
2 | 2
Нужно получить список автомобилей у которых список запчастей совпадает от двух и более. И еще их нужно отсортировать в порядке совпадения от большего к меньшему. Список запчастей задает пользователь в фильтре
Вот что у меня получилось в итоге
SELECT *
FROM auto as a
INNER JOIN spare_to_auto AS s_to_a
ON a.id = s_to_a.auto_id
INNER JOIN spare AS s
ON s_to_a.spare_id = s.id AND s.id IN ($список_запчастей)
GROUP BY a.id
Но к сожаление работает это запрос не правильно.
select name from auto as a
inner join (
select i1.auto_id,count(1) as count from spare_to_auto as i1
inner join spare_to_auto as i2 on i1.spare_id=i2.spare_id
and i1.auto_id<>i2.auto_id
group by i1.auto_id) as b
on a.id=b.auto_id and b.count>1
SELECT *
FROM auto as a
INNER JOIN spare_to_auto AS s_to_a ON a.id = s_to_a.auto_id
WHERE s_to_a.spare_id IN ($список_запчастей)
GROUP BY a.id
HAVING count(1)>1
ORDER BY count(1) desc
Таблицу spare
из запроса я убрал, так как выборка идет по ID запчастей, которые и так уже есть в spare_to_auto
. Кстати, поиск всех запчастей отличается только изменением условия в having на равенство количеству искомых.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Копирую чужую команду для MySQL в терминал, состоит из нескольких строкКак мне переместиться на верхние строки и редактировать их?
Доброго времени суток! Недавно заинтересовался оконными приложениями на Java, но наткнулся на некоторое количество типов самих приложенийХотел...