MySQL: использовать данные столбца из другой строки в выходной строке той же таблицы

У меня есть таблица с категориями и подкатегориями, связанная вместе со столбцом «cat_parent», в котором есть идентификатор родительской категории.

Когда я ищу что-то, я бы хотел, чтобы результат включал слаг родительской категории (или NULL, если у него нет родителя) в качестве виртуального столбца «parent_slug».

Это моя таблица:

+-----+------------+------------+------------+
| id  | cat_name   | cat_slug   | cat_parent |
+-----+------------+------------+------------+
| 1   | Cars       | cars       | 0          |
+-----+------------+------------+------------+
| 2   | Planes     | planes     | 0          |
+-----+------------+------------+------------+
| 3   | Volvo      | volvo      | 1          |
+-----+------------+------------+------------+
| 4   | Alfa Romeo | alfa-romeo | 1          | 
+-----+------------+------------+------------+
| 5   | Boeing     | boeing     | 2          | 
+-----+------------+------------+------------+
| 6   | Mitsubishi | mitsubishi | 1          | 
+-----+------------+------------+------------+
| 7   | Mitsubishi | mitsubishi | 2          | 
+-----+------------+------------+------------+

Когда я ищу «volvo», я бы хотел, чтобы результат был таким:

+-----+----------+----------+------------+-------------+
| id  | cat_name | cat_slug | cat_parent | parent_slug |
+-----+----------+----------+------------+-------------+
| 3   | Volvo    | volvo    | 1          | cars        |
+-----+----------+----------+------------+-------------+

Или найдите mitsubishi, и это будет выглядеть так:

+-----+------------+------------+------------+-------------+
| id  | cat_name   | cat_slug   | cat_parent | parent_slug |
+-----+------------+------------+------------+-------------+
| 6   | Mitsubishi | mitsubishi | 1          | cars        |
+-----+------------+------------+------------+-------------+
| 7   | Mitsubishi | mitsubishi | 2          | planes      |
+-----+------------+------------+------------+-------------+

И, представьте, что я бы выполнил поиск по запросу "s" (КАК "%s%"), это будет выглядеть так:

+-----+------------+------------+------------+-------------+
| id  | cat_name   | cat_slug   | cat_parent | parent_slug |
+-----+------------+------------+------------+-------------+
| 1   | Cars       | cars       | 0          | NULL        |
+-----+------------+------------+------------+-------------+
| 2   | Planes     | planes     | 0          | NULL        |
+-----+------------+------------+------------+-------------+
| 6   | Mitsubishi | mitsubishi | 1          | cars        |
+-----+------------+------------+------------+-------------+
| 7   | Mitsubishi | mitsubishi | 2          | planes      |
+-----+------------+------------+------------+-------------+

Надеюсь это имеет смысл. Я бы не хотел менять структуру таблицы или добавлять реляционные таблицы, поскольку для простых категорий это работает очень хорошо и быстро.

И да, Mitsubishi строит самолеты. :П

Заранее спасибо!

Во всех ваших примерах показано имя кошки-родителя (но в столбце с надписью «parent_slug»), а не слизняк-кошка родителя, как указано в вашем тексте; что правильно?

ysth 12.07.2024 07:11

Это простое самостоятельное левое соединение

ysth 12.07.2024 07:12

Обновлены некоторые значения cat_name, чтобы их было легче различать, и исправлена ​​опечатка в cat_slug, в которой было «volvo» вместо «cars». Я попробовал левое соединение, но просто не понимаю, как они работают, постоянно получал неоднозначные ошибки и в конце концов сдался.

Paul 12.07.2024 08:11

Включает ли cat_slug модели? Если нет, то это кажется излишним.

P.Salmon 12.07.2024 08:20

Чтобы добавить немного больше содержания к вашему вопросу, вы можете отредактировать его и добавить свою лучшую попытку левого соединения вместе с полученными ошибками. Возможный ответ может затем объяснить вам ошибки или что не так с запросом. Так вы узнаете намного больше, и ваш вопрос станет более информативным для других. Мы все учимся на своих ошибках, а не на копировании готовых ответов.

KIKO Software 12.07.2024 08:20

@P.Salmon Нет, я использовал транспорт как более понятный пример. Настоящая таблица намного сложнее. Я добавил туда и Alfa Romeo, чтобы показать, что слизни не лишние.

Paul 12.07.2024 08:38

@KIKOSoftware Вы абсолютно правы, я должен был это сделать. Сделаю это в будущих постах. Тем не менее, я учусь у них, даже с готовыми ответами, поскольку мне приходится адаптировать их к своей таблице, которая сильно отличается от примера, и учиться в процессе этого.

Paul 12.07.2024 08:44
Освоение архитектуры микросервисов с 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
7
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

JOIN объединяет данные из нескольких таблиц (или строк в данном случае) в один результат.

В этом случае нам нужны все данные + родительский пул.

LEFT JOIN объединяет ВСЕ данные слева с тем, что вы указываете справа (p.cat_slug as parent_slug), в данном случае cat_parent, где c.cat_parent слева соответствует p.id справа (on c.cat_parent = p.id), получает cat_slug и выводит как новый столбец «parent_slug» (p.cat_slug as parent_slug).

SELECT c.*, p.cat_slug as parent_slug FROM YOUR_TABLE_NAME as c
Left Join YOUR_TABLE_NAME as p on c.cat_parent = p.id;

Замените YOUR_TABLE_NAME правильным именем таблицы.

Не совсем понимаю, почему за ваш ответ проголосовали отрицательно, ведь он работает очаровательно! Большое спасибо! Теперь потратьте некоторое время на то, чтобы выяснить, как это работает, поскольку я никогда успешно не использовал левые соединения, все, что они мне дали, это ошибки синтаксиса и количества столбцов, ха-ха.

Paul 12.07.2024 08:49

@Paul: Вероятно, за него проголосовали отрицательно, потому что это заставило вас задуматься, почему это работает. Будете ли вы действительно пытаться понять, почему это работает, или просто скопируете это и пойдете дальше? Если вам это удастся, вам рекомендуется отредактировать этот ответ, чтобы улучшить его. У вас довольно низкая репутация, поэтому я не уверен, что вы можете его редактировать, но этот ответ был бы значительно улучшен, если бы у него было объяснение.

KIKO Software 12.07.2024 09:22

@KIKOSoftware Потратил некоторое время на обработку запроса и просмотр нескольких руководств - теперь я знаю не только LEFT JOIN, но также INNER, RIGHT и FULL JOIN. Я отредактировал ответ. Имейте в виду, я не так хорош в объяснении того, как все работает, но я приложил все усилия. :)

Paul 13.07.2024 08:13

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