Поиск MySQL в 3-й таблице через таблицу отношений

Скажем, у меня есть три таблицы:

  • Таблица PRODUCT (P) имеет ID, NAME

  • Таблица CATEGORY (C) имеет ID, NAME

  • Таблица RELATION (R) имеет ID, PRODUCT_ID, CATEGORY_ID

В настоящее время я нахожусь на странице списка продуктов и хочу, чтобы функция могла выполнять поиск продуктов по названию категории.

select P.* 
from P
where P.id in (select group_concat(distinct R.product_id) from C join R on C.id=R.category_id where C.name like '%something%')

Вышеупомянутый SQL даст мне только первое совпадение, но выполнение запроса в скобках вернет более одного идентификатора. Как мне это исправить?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

group_concat() не нужен:

select P.* 
from P
where P.id in (select R.product_id
               from C join
                    R
                    on C.id = R.category_id
               where C.name like '%something%'
              );

Ваш запрос в порядке, но чаще он записывается как:

select P.*
from P join
     R
     on P.id = R.product_id join
     C
     on C.id = R.category_id
where C.name like '%something%';

Эта версия может возвращать дубликаты, если более чем одна категория соответствует условию like.

Ты прав! удалите и все работает! В любом случае другой способ написать этот запрос?

Tyler Tong 12.03.2018 03:10

большое спасибо! Я пробовал второй sql, но, к сожалению, мне также нужно перечислить все категории, к которым принадлежит каждый продукт. мой полный sql: выберите p. *, group_concat (отличный c.id) как category_ids из p left join r на r.product_id = p.id left join c на c.id = r.category_id, где ### group by p .id ### будет запросом, который я ищу в этом вопросе. Если я помещу ваше второе решение в ###, я не смогу получить все идентификаторы категорий для каждого продукта.

Tyler Tong 12.03.2018 03:18

Другие вопросы по теме