|
一个菜鸟MYSQL用户....我有一个简单的MySQL查询,该查询返回值,并使用GROUP_CONCAT函数:
- L5 l5 ?7 ]/ J" bSELECT Productid, Name, GROUP_CONCAT(value)
: {$ e" Z; M4 Q% d; Q! E1 H. B: WFROM search_export ' Y8 u2 D3 Y) |. H! R' P8 {
Group By Productid, Name;! t. W, a, t1 a2 A5 t$ j2 N
Productid Name GROUP_CONCAT(value)
8 A; {7 ~* _3 X3 J666056542 Brand Name Netgear
% N& U/ C; F% z& U Q1054677552 Ethernet Technology Gigabit Ethernet* W: U, K# A% k5 _9 N0 z) t
665655662 Form Factor Wall Mountable,Desktop
( n; @5 X+ f, l5 Z0 M" o& t56565765 Media Type Supported Twisted Pair
: \1 Y0 T1 y6 T& K但是,我需要转置查询,以便它以单独的列而不是行的形式返回“名称”。MySQL完全有可能吗?4 @" Z( _. {2 m. G& u5 \
5 j4 B' R- {# a7 u* d
解决方案:2 h/ `0 l) ^5 O+ K$ L% s
4 k( v% X( K, v% d! E5 k
\& b+ B" X4 t. \" Y8 A* ]# X9 X& L
您需要执行一项PIVOT操作,MySQL本身不支持该操作(与某些其他RDBMS不同)。0 z7 K3 N; X% S8 e
您可以获得的最接近的结果是按照以下几行构造SQL:
8 N3 y! R. a( T+ F9 PSELECT ProductId,
: U7 R8 C% @& m- ]5 k. z GROUP_CONCAT(IF(Name='Brand Name' ,value,NULL))
+ Q( k) ] @; Z, C AS `Brand Name`,
+ g4 ?+ h% a: u; o GROUP_CONCAT(IF(Name='Ethernet Technology' ,value,NULL))
8 a5 g6 Z1 j: h% l+ Z3 \ AS `Ethernet Technology`,
6 O% s a3 d9 `9 ]! o GROUP_CONCAT(IF(Name='Form Factor' ,value,NULL))' a: g7 Y$ f# H. L+ W& K9 l, f
AS `Form Factor`,2 I# T' \7 K1 v9 }
GROUP_CONCAT(IF(Name='Media Type Supported',value,NULL))0 ~5 m+ p P3 f6 s8 l
AS `Media Type Supported`
6 J" r2 `* L' a$ q) P! x7 ~FROM search_export7 N7 J9 @; F" Q& z
GROUP BY ProductId% ?+ n c2 g, m
如果可能的Name值是动态的,则可以从以下结果中以更高级的语言生成此类SQL:) W2 w0 w6 [6 s, s7 p" o! H
SELECT DISTINCT Name FROM search_export B; x* b: ~2 A) ?: ]
确实,甚至可以使用SQL本身:: c ~' v; k$ J7 P+ b1 s
SELECT CONCAT('+ S# v8 e9 z) {6 @* I+ S
SELECT ProductId, ',* E0 {0 ?- Q' D* r( i
GROUP_CONCAT('9 R% S/ m5 @7 h
GROUP_CONCAT(IF(Name=',QUOTE(Name),',value,NULL))4 V# N: \: G% y( d6 ~$ y
AS `',REPLACE(Name,'`','``'),'`'$ h7 g0 j; q* \/ i
), '6 ]8 @/ @+ `/ ?
FROM search_export
- R* d7 c5 C: A5 I1 N, H% X GROUP BY ProductId
: w- R/ h- N# n7 y ')& {5 @( B- C: m6 J$ f
INTO @sql4 C( i$ {# {# y3 L
FROM (
& a8 R; w* w, u. q SELECT DISTINCT Name FROM search_export: g8 h% V6 ^" \; F. c) p
) t;" ^5 m) ~+ a/ a' b! Y% T: X2 F
PREPARE stmt FROM @sql;
2 q3 ^" y) P- j; d! ]EXECUTE stmt;
) B: U9 C) ]0 K+ q7 \/ ?/ @6 E9 sDEALLOCATE PREPARE stmt;
5 |' m- G& f5 S; K7 U请注意,如果有很多不同的Name值,则可能需要增加group_concat_max_len其默认值1KiB。 |
|