SQL-запрос для объединения двух таблиц и получения данных?

У меня есть две таблицы а, б.

Таблица table1 состоит из 5 столбцов:

  primary key AS pkid
  table2_primary-key AS id1
  table2_primary-key AS id2 
  rating
  date

Таблица table2 состоит из 2 столбцов:

 primary key AS pkid
 name

Я хочу присоединить table1 к table2 и отобразить первичный ключ, рейтинг и дату из table1, а также имена, соответствующие table1.id1 и table1.id2.

Для этого я написал следующий запрос

Select 
  a.pkid
  , b.name
  , c.name
  , a.rating
  , a.date
FROM table1 a, table2 b, table2 c
WHERE a.id1=b.pkid and a.id2=c.pkid;

Есть ли лучший способ написать этот запрос?

Что ж ... у вас есть внешние ключи два, поэтому вам нужны соединения два.

The Impaler 18.12.2018 18:57

Добро пожаловать в Stack Overflow! Вы обнаружите, что у вас будет больше впечатлений, если вы выберете момент, чтобы взять Обзор переполнения стека. Вы также можете прочитать о том, как задать хороший вопрос. Если вы следуете нормам сообщества Stack Overflow и подходите к нему так, чтобы помогать другим, это сослужит вам хорошую службу.

StoneGiant 18.12.2018 18:58
Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я думаю, что ваш запрос по сути хорош. Я бы улучшил два аспекта:

  • Используйте современный синтаксис соединения.
  • Если внешние ключи (id1 и id2) допускают значение NULL (вы не говорите), я бы использовал внешние соединения.

Измененная версия вашего запроса будет выглядеть так:

select
  a.pkid, b.name, 
  case when c.name is null then 'system' else c.name end,
  a.rating, a.date
from table1 a
left join table2 b on a.id1 = b.pkid
left join table2 c on a.id2 = c.pkid

Да table1 id1 не оплачивается, но id2 несколько раз ноль в это время Я хочу отображаемое имя как системное

Ramya 18.12.2018 19:07

@Ramya, это довольно важная часть бизнес-логики, которую вы не упомянули.

digital.aaron 18.12.2018 19:13

@Ramya В соответствии с просьбой, я добавил предложение CASE для преобразования пустого id2-name в 'system',

The Impaler 18.12.2018 19:15

Спасибо, это работает

Ramya 18.12.2018 19:36

Вам всегда понадобятся два соединения (поскольку id1 и id2 разные) ...

Однако я бы использовал явное соединение вместо запятой. Как таковой

SELECT A.PKID, B.NAME, C.NAME, A.RATING, A.NAME
FROM TABLE1 A
LEFT JOIN TABLE2 B ON A.ID1=B.PKID
LEFT JOIN TABLE2 C ON A.ID2=C.PKID;

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