Можно ли группировать строки таким образом, используя MySQL?
У меня есть таблица MySQL, например:
ID, USER, PARAM, VAL
--------------------
1 | 1 | NAME | ADAM
2 | 1 | AGE | 15
3 | 2 | NAME | EVA
4 | 2 | AGE | 16
5 | 3 | NAME | CRISS
6 | 3 | AGE | 14
И мне любопытно, есть ли запрос, который даст мне нечто похожее на:
1 | ADAM | 15
2 | EVE | 16
3 | CRISS| 14
До сих пор я просто использовал приведенный ниже запрос и группировал записи в цикле.
SELECT * FROM table WHERE PARAM ='NAME' OR PARAM = 'AGE'
Я пытался использовать GROUP
, но без успеха.
Ответы
Ответ 1
Вы можете сделать такой запрос:
SELECT t1.user,
(
SELECT val FROM tab1 t2
WHERE t2.user = t1.user
AND t2.param = 'Name'
) name,
(
SELECT val FROM tab1 t2
WHERE t2.user = t1.user
AND t2.param = 'Age'
) age
FROM tab1 t1
GROUP BY user
Другая возможность - group_concat, но тогда у вас есть все значения в одном столбце.
SELECT user, group_concat(param, ':', val)
FROM tab1
GROUP BY user
Ответ 2
Используйте join в той же таблице:
SELECT a.USER user_id, a.VAL user_name, b.VAL user_age
FROM `table` a
INNER JOIN `table` b ON a.USER = b.USER
WHERE a.PARAM = 'NAME'
AND b.PARAM = 'AGE'
Результат:
user_id user_name user_age
1 ADAM 15
2 EVA 16
3 CRISS 14
Ответ 3
Нет необходимости использовать JOIN. Попробуйте следующее:
SELECT USER,
MAX(CASE PARAM WHEN 'NAME' THEN VAL ELSE NULL END) AS NAME,
MAX(CASE PARAM WHEN 'AGE' THEN VAL ELSE 0 END) AS AGE
FROM test
GROUP BY USER;
Ответ 4
Вы можете создать сводный вид, используя наиболее часто используемый метод, как
select
user,
max(case when param = 'NAME' then val end) as name,
max(case when param = 'AGE' then val end) as age
from mytable
group by user
Ответ 5
Привет, я реплицирую вашу проблему в моем примере db, попробуйте этот запрос:
SELECT t1.USER,VAL,(SELECT VAL AS AGE FROM table1 where USER = t1.USER AND PARAM = 'AGE') as AGE
FROM table1 t1
WHERE param = 'NAME'
или используйте соединение в таблице:
SELECT a.USER, a.VAL, b.VAL
FROM table1 t1
INNER JOIN table1 t2
ON t1.USER = t2.USER
WHERE t1.PARAM = 'NAME'
AND t2.PARAM = 'AGE'
замените table1 на имя вашей таблицы.