Выборка и объединение двух таблиц, с переносом совпадающих значений одной из таблиц, из строки в столбец результата
Есть две таблицы.
users:
| id | user | email |
| --------- | -------------- | ------------------ |
| 1300 | user_nick | [email protected] |
| 1301 | user_tom | [email protected] |
| 1302 | user_anna | [email protected] |
values:
| field_id | user_id | value |
| --------- | -------------- | -------------- |
| 1 | 1300 | Nick |
| 3 | 1300 | New York |
| 5 | 1300 | 555 555 55 |
| 1 | 1301 | Tom |
| 3 | 1301 | Utha |
| 5 | 1301 | 555 555 66 |
Если я делаю запрос:
SELECT u.id, u.user, u.email, v.value FROM users u, values v WHERE v.user_id = 1300 AND u.id = 1300 AND (v.field_id = 1 OR v.field_id = 5);
закономерно возвращается такой результат:
| id | user | email | value |
| --------- | -------------- | ------------------ | -------------- |
| 1300 | user_nick | [email protected] | Nick |
| 1300 | user_nick | [email protected] | 555 555 55 |
Понятно, что его можно разобрать, и получить требуемую структуру... но интересно, а возможно ли создать один запрос, который вернёт, требуемую структуру? А именно:
| id | user | email | 1 | 5 |
| --------- | -------------- | ------------------ | -------------- | -------------- |
| 1300 | user_nick | [email protected] | Nick | 555 555 55 |
То-есть, чтобы первые ячейки строк из таблицы values преобразовались в дополнительные столбцы в результате запроса? Точно помню, что когда-то давно в визуальном редакторе запросов MS Aссess, что-то подобное делал, но сейчас дело имею с MySQL, и никак не могу сформировать запрос, и сформулировать поиск в гугле, чтобы найти подходящие примеры. Спасибо!
Ответы (1 шт):
Автор решения: taravasya_github
→ Ссылка
Наткнулся на собственный вопрос, и решил отписаться о готовом решении:
SELECT
id,
user,
email,
username,
v1.value Nickname1,
v2.value Phone5
FROM users u
LEFT JOIN values v1 on v1.item_id = u.id AND v1.field_id = 1
LEFT JOIN values v2 on v2.item_id = u.id AND v2.field_id = 5
GROUP BY u.id
| id | user | Nickname1 | Phone5 | |
|---|---|---|---|---|
| 1300 | user_nick | [email protected] | Nick | 555 555 55 |
| 1301 | user_tom | [email protected] | Tom | 555 555 66 |
| 1302 | user_anna | [email protected] | NULL | NULL |