Как сделать sql-запрос чтобы выборка была из трех таблиц с объединением столбцов у двух таблиц

Рейтинг: 0Ответов: 1Опубликовано: 13.04.2023

У меня есть три таблицы "users" users "fly_invoices" fly_invoices и "tycoon_invoices" tycoon_invoices в одной базе. Мне нужно сделать sql-запрос так чтобы выборка была в таком виде:

chat_id username name lastname phone date from to quantity_passengers

где в столбцы date, from и to попадает объединенная информация из двух таблиц fly_invoices и tycoon_invoices, а в остальные столбцы попадает всё остальное соответственно по смыслу: в первые пять из таблицы users, а в последний столбец, если была строка взята из fly_invoices, то туда ставится соответствующая цифра, а если строка из tycoon_invoices, то туда ставится NULL Как сделать такой запрос?

Ответы

▲ 0Принят

В вопрос нужно бы добавить тестовые данные примерно так:

create table users (id int,chat_id int,username varchar(20),name varchar(20)
   ,lastname varchar(20),phone varchar(20),date_start_bot varchar(20));
insert into users values(1,119,'paveluss','Pavel','Tsyganov','8-119','2023-04-11 14:49:14');
insert into users values(2,121,'ivanus','Ivan','Ivanov','8-121','2023-04-11 12:49:14');
insert into users values(3,131,'petrovich','Petr','Petrov','8-131','2023-04-13 14:49:14');

create table fly_invoices (id int,fly_from varchar(20),fly_to varchar(20)
            ,quantity_passengers int,[date] varchar(20),chat_id int);
insert into fly_invoices values(1,'Kazan','Moskva',3,'2023-04-22',119);
insert into fly_invoices values(4,'Norilsk','Leninogorsk',2,'2023-04-24',119);  
insert into fly_invoices values(2,'Moskva','Baku',5,'2023-04-23',121);
insert into fly_invoices values(3,'Piter','Erevan',1,'2023-04-23',131);

create table tycoon_invoices (id int,tycoon_from varchar(20),tycoon_to varchar(20)
            ,[date] varchar(20),chat_id int);
insert into tycoon_invoices values(3,'Tambov,Rossiya','Samara,Rossiya','2023-04-23',119);

Пример желаемого ответа:

chat_id username name lastname phone date from to quantity_passengers
119 paveluss Pavel Tsyganov 8-119 2023-04-22 Kazan Moskva 3
119 paveluss Pavel Tsyganov 8-119 2023-04-24 Norilsk Leninogorsk 2
121 ivanus Ivan Ivanov 8-121 2023-04-23 Moskva Baku 5
131 petrovich Petr Petrov 8-131 2023-04-23 Piter Erevan 1
119 paveluss Pavel Tsyganov 8-119 2023-04-23 Tambov,Rossiya Samara,Rossiya null

Мой ответ на вопрос - пример запроса

select u.chat_id,username,name,lastname,phone,[date],[from],[to],quantity_passengers
from 
  (
  select fly_from as [from],fly_to as [to],[date],quantity_passengers,chat_id
  from fly_invoices
  union all
  select tycoon_from as [from],tycoon_to as [to],[date],null as quantity_passengers,chat_id
  from tycoon_invoices
  ) t
left join users u on u.chat_id=t.chat_id

пример
пример для MySQL

Примечание: использование служебных слов SQL в качестве названий полей доставляет хлопоты то в одном, то в другом месте. Не знаешь где вылезет. Сомнительная практика, на мой взгляд.