Сложный необычный запрос - 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 запрос, чтобы выводилось в таком виде:
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
В одну строку вывод запихнуть не получилось, выводится так, что на новой строке новый параметр заполненный, а остальные пустые. 19 Имя Иванов NULL NULL NULL NULL 19 NULL NULL Фамилия Иван NULL NULL 19 NULL NULL NULL NULL Отчество Петрович Если добавить сообъединение со своей же таблицей, этого быть не должно. Пробовал даже пускай без объединения со второй таблицей имен параметров:
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`
Но проверить не смог, phpmyadmin повис в loading'е и ни в какую. И это всего для 3 pid'ов, я планирую около 50 выводить за раз.

Решение задачи: «Сложный необычный запрос»

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) результаты к этой же таблице, используя общие столбцы. В данном случае, запрос выбирает следующие столбцы:

  1. cid - идентификатор клиента
  2. name - имя клиента
  3. val - значение, связанное с клиентом Запрос также присоединяет (LEFT JOIN) результаты из четырех других таблиц (pid_name), которые содержат информацию о типах идентификаторов клиентов. Каждая из этих таблиц имеет столбцы name и val, которые соответствуют имени и значению идентификатора. Результатом запроса будет список уникальных клиентов с их идентификаторами, именами и значениями, связанными с каждым идентификатором.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5