Подтвердить что ты не робот

Можно ли группировать строки таким образом, используя 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, но без успеха.

4b9b3361

Ответ 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 на имя вашей таблицы.