Как сделать sql-запрос чтобы выборка была из трех таблиц с объединением столбцов у двух таблиц
У меня есть три таблицы
"users"
"fly_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 Как сделать такой запрос?
Ответы (1 шт):
В вопрос нужно бы добавить тестовые данные примерно так:
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
Примечание: использование служебных слов SQL в качестве названий полей доставляет хлопоты то в одном, то в другом месте. Не знаешь где вылезет. Сомнительная практика, на мой взгляд.