@rygat

Как составить сложную выборку из двух таблиц?

Есть две таблицы
table1
+----+----------+--------+-------------+----------+----------+----------+------------+
| id |  address | office |     fio     | counter1 | counter2 | counter3 |    date    |
+----+----------+--------+-------------+----------+----------+----------+------------+
| 1  | Ленина 3 |   65   | Иванов И.И. |   1678   |    127   |    246   | 01.01.2024 |
| 2  | Ленина 4 |   18   | Павлов П.П. |   327    |    64    |    346   | 03.01.2024 |
+----+----------+--------+-------------+----------+----------+----------+------------+

table2
+----------+--------+----------+---------+
|  address | office | counter  |   num   |
+----------+--------+----------+---------+
| Ленина 3 |   65   | counter1 | c000001 |
| Ленина 3 |   65   | counter2 | c000002 |
| Ленина 3 |   65   | counter3 | c000003 |
| Ленина 4 |   18   | counter1 | c000004 |
| Ленина 4 |   18   | counter2 | c000005 |
| Ленина 4 |   18   | counter3 | c000006 |
+----------+--------+----------+---------+


Нужно выгрузит их в файл csv в таком виде
+----------+--------+-------------+----------+-------+---------+------------+
|  address | office |     fio     |  counter | value |   num   |    date    |
+----------+--------+-------------+----------+-------+---------+------------+
| Ленина 3 |   65   | Иванов И.И. | counter1 | 1678  | c000001 | 01.01.2024 |
| Ленина 3 |   65   | Иванов И.И. | counter2 | 127   | c000002 | 01.01.2024 |
| Ленина 3 |   65   | Иванов И.И. | counter3 | 246   | c000003 | 01.01.2024 |
| Ленина 4 |   18   | Павлов П.П. | counter2 | 327   | c000004 | 03.01.2024 |
| Ленина 4 |   18   | Павлов П.П. | counter2 | 64    | c000005 | 03.01.2024 |
| Ленина 4 |   18   | Павлов П.П. | counter2 | 346   | c000006 | 03.01.2024 |
+----------+--------+-------------+----------+-------+---------+------------+

Таблицы для примера сокращены, количество столбцов и counter'ов в три раза больше.
Сейчас я загружаю первую таблицу и на php в цикле все собираю каждый раз подгружая данные из второй таблицы. Но это очень долго получается и у пользователя закрадывается сомнение, не завис ли процесс.
Я пробовал объединить их slq запросом
SELECT t1.id, t1.address, t1.office, t1.fio, t1.counter, t1.value, table2.num, t1.date from (
SELECT id, address, office, date, fio, 'counter1' as counter, counter1 as 'value' FROM table1
UNION ALL
SELECT id, address, office, date, fio, 'counter2' as counter, counter2 as value FROM table1
UNION ALL
SELECT id, address, office, date, fio, 'counter3' as counter, counter3 as value FROM table1
) t1
LEFT JOIN table2 ON t1.address = table2.address AND t1.office = table2.office AND t1.counter = table2.scetchik
WHERE (t1.date BETWEEN '2021-02-01' AND '2021-02-25') AND t1.value != 0;

но база также долго думает, да и как правильно поместить этот запрос в laravel.
Может есть у кого элегантное решение задачи?
  • Вопрос задан
  • 126 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Akina
Сетевой и системный админ, SQL-программист.
SELECT address, 
       office, 
       t1.fio, 
       t2.counter, 
       CASE t2.counter
           WHEN 'counter1' THEN t1.counter1
           WHEN 'counter2' THEN t1.counter2
           WHEN 'counter3' THEN t1.counter3
           END value,
       t2.num,
       t1.date       
FROM table1 t1
JOIN table2 t2 USING (address, office)
Ответ написан
kawabanga
@kawabanga
SELECT t2.address, t2. office, t1.fio, t2.counter, t1.value (только этого поля нет у вас)
FROM table2 t2
LEFT JOIN table1 ON t1.office=t2.office
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы