Сложный необычный запрос - MySQL
Формулировка задачи:
Добрый день.
Есть 2 таблицы. Певая "client" с полями "id" "cid" "pid" "val" и множественными записями типа
1 5 1 Петя
2 5 2 Петров
3 5 3 Алексеевич
4 5 8 50000
5 12 1 Вася
6 12 2 Сидоров
...
Вторая "pid_name" таблица с полями "id" "pid" "name" и записями вида
1 1 Имя
2 2 Фамилия
3 3 Отчество
4 8 Зарплата
...
Хочу написать select запрос, чтобы выводилось в таком виде:
Пробы написать:
В одну строку вывод запихнуть не получилось, выводится так, что на новой строке новый параметр заполненный, а остальные пустые.
19 Имя Иванов NULL NULL NULL NULL
19 NULL NULL Фамилия Иван NULL NULL
19 NULL NULL NULL NULL Отчество Петрович
Если добавить сообъединение со своей же таблицей, этого быть не должно. Пробовал даже пускай без объединения со второй таблицей имен параметров:
Но проверить не смог, phpmyadmin повис в loading'е и ни в какую. И это всего для 3 pid'ов, я планирую около 50 выводить за раз.
client.cid name name_val surname surname_val secondname secondname_val salary salary_val 5 Имя Петя Фамилия Петров Отчество Алексеевич Зарплата 50000
SELECT DISTINCT(cid), CASE WHEN client.pid=1 THEN name END AS name, CASE WHEN client.pid=1 THEN val END AS name_val, CASE WHEN client.pid=2 THEN name END AS surname, CASE WHEN client.pid=2 THEN val END AS surname_val, CASE WHEN client.pid=3 THEN name END AS secondname, CASE WHEN client.pid=3 THEN val END AS secondname_val FROM `client` JOIN `pid_name` ON client.pid=pid_name.pid
SELECT DISTINCT(client.cid), CASE WHEN cl1.pid=1 THEN cl1.val END AS name_val, CASE WHEN cl2.pid=2 THEN cl2.val END AS surname_val, CASE WHEN client.pid=3 THEN client.val END AS secondname_val FROM `client` AS cl1, `client` AS cl2, `client`
Решение задачи: «Сложный необычный запрос»
textual
Листинг программы
select distinct u.cid, a1.name, a1.val, a2.name, a2.val, a3.name, a3.val, a4.name, a4.val from client u left join (select client.cid, pid_name.name, client.val from pid_name, client where pid_name.pid=client.pid and pid_name.id=1) a1 on a1.cid = u.cid left join (select client.cid, pid_name.name, client.val from pid_name, client where pid_name.pid=client.pid and pid_name.id=2) a2 on a2.cid = u.cid left join (select client.cid, pid_name.name, client.val from pid_name, client where pid_name.pid=client.pid and pid_name.id=3) a3 on a3.cid = u.cid left join (select client.cid, pid_name.name, client.val from pid_name, client where pid_name.pid=client.pid and pid_name.id=4) a4 on a4.cid = u.cid
Объяснение кода листинга программы
Код выполняет запрос к базе данных с использованием языка SQL. Запрос выбирает уникальные значения для определенных столбцов из таблицы client
и присоединяет (LEFT JOIN) результаты к этой же таблице, используя общие столбцы.
В данном случае, запрос выбирает следующие столбцы:
- cid - идентификатор клиента
- name - имя клиента
- val - значение, связанное с клиентом Запрос также присоединяет (LEFT JOIN) результаты из четырех других таблиц (pid_name), которые содержат информацию о типах идентификаторов клиентов. Каждая из этих таблиц имеет столбцы name и val, которые соответствуют имени и значению идентификатора. Результатом запроса будет список уникальных клиентов с их идентификаторами, именами и значениями, связанными с каждым идентификатором.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д