2016-01-05 65 views
20

我有一個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但沒有成功。

+6

你爲什麼要這樣構造表格? –

+0

爲什麼不製作一個表格:id,user,name,age – SuperDJ

+0

因爲每個用戶都有不同的參數 - 大約20個,而且這個值可以在以後輕鬆改變。這種方式更容易添加一些沒有ALTERing表的東西。我只需要通過一個查詢獲取NAME和AGE。 –

回答

5

你可以做一個查詢這樣的:

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 
15

使用同一個表聯接:

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 
+2

這是一個比max/group更好的方法。 –

+2

@SalmanA爲什麼? AFAIK它更糟。嘗試使用超過1或2個值來獲取,需要爲每個新列加入連接。 – edc65

3

嗨,我複製你的問題在我的分貝例如,嘗試此查詢:

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。

8

您可以生成使用最常用的技術樞軸視圖

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 
9

有沒有必要使用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; 
+0

這是有效的,我有時會使用它,例如在ETL的數據轉換中。刪除'ELSE NULL'(並考慮可讀性,添加一些換行符) – edc65

+1

我已經使用了兩種風格的查詢來解決這個問題,我可以說這個更快,並且在我的看法,更可讀,尤其是當你有很多用戶屬性來檢查。 – Jupotter

+0

'ELSE NULL'無用,但在某些情況下,'ELSE 0'可能是明顯錯誤的。現在爲@Abhik Chakraborty投票 – edc65

相關問題