|
我一直在在mysql数据库中的一个表上工作,该表被本地保存在wamp服务器上,我正在wamp中使用phpmyadmin区域来运行查询。我正在尝试获取数据来执行以下操作:
. d9 W) J, T, {2 F- f: |任何人都可以帮我建立一张带有许多工厂记录的表格。植物可以具有多个名称,该表将其显示为不同的记录。该表称为new_plantsname
* W8 ` ]5 K( U0 N' y4 Fplantid name: Q5 l7 i$ O' J" ?0 c+ K5 K, ~; ^
1 tree! P, A# k, j9 H# s6 c! L4 a
1 rose5 s; |3 Y' `* O% [) W5 s1 }9 E! b. M
2 bush: P, T" t$ o7 |, @4 ] l
3 tree; [5 m! {. P$ j7 z: M" u& W
3 bush
7 k2 n' L" j/ C1 c- w5 k3 rose
6 p( T4 o- @& p2 R# c3 {0 ?$ L持续超过3000条记录9 M9 H, k! t3 u2 H, q3 |* M
我想要的是将具有相同plantid的记录组合在一起,并在不同的列中显示不同的名称:- ?& W _9 `4 {9 v; d) w3 F# M( J9 h
plantid name1 name2 name3 ...
: X1 v/ r* x+ p7 K+ U" O1 tree rose NULL+ y& G; [; g9 R% F! Y- r7 A
2 shrub NULL NULL
9 J+ ]% ]* A& X' r4 i3 tree rose bush
- g' M$ W" ?3 B8 \8 R' X7 I1 x等等
a. h' B0 S; ~! v$ U) U; y. D乍一看,我相信一家工厂的名称不超过4个。
3 Y6 {6 |) W6 H' @8 X可以帮我查询做到这一点。我也想将结果保存到新表中
, R" v/ G N- a" I9 r z+ W有人给了我以下答案:
6 f: d# l9 p- s# R* L" T6 oselect plantid,* l6 N: G1 t2 c. e# s
max(case when nameRn = 'name1' then name end) Name1,
6 Y7 F( r( V% ~ max(case when nameRn = 'name2' then name end) Name2,
$ M: Q. ^. @( E max(case when nameRn = 'name3' then name end) Name3, V/ k. x1 v/ z& b' P: K
max(case when nameRn = 'name4' then name end) Name4
! Q" i0 G5 ~3 z( I; v* pfrom
+ {5 C! m' ?$ j+ I(, r0 }$ o% ?* K1 d: s
select plantid, name,
5 X# b5 i+ P/ m3 V1 ~: U concat('name', @num := if(@plantid = `plantid`, @num + 1, 1)) as nameRn,
[* ^) [* M2 K% v' i; T" s; c @plantid := `plantid` as dummy
/ S# V5 i% h+ n: z" m. I from$ r! B4 R) r6 c# @0 b( {
(6 t4 r! @& f6 [
select plantid, name, @rn:=@rn+1 overall_row_num8 _% N% w& |# u6 U# d
from yourtable, (SELECT @rn:=0) r
8 o6 d# r, o' X+ |, H ) x1 u7 B; B% C8 e, D8 I, i. v, s0 Q) |. K7 {
order by plantid, overall_row_num
4 ?+ N/ E; n5 }% ]" b) src
1 z- h) r- a: L( B0 q# Egroup by plantid;5 J6 n1 L- q# | Y' k9 ~( U
这似乎可以正常工作,但没有错误,但是它没有合并记录,只保留了第一个记录的名称,而没有保留其他记录。使用的数据:) y9 \9 }! m# ?
plantid name
6 D. M4 S4 h3 ]/ U- X% P7 L 1 tree
; R) `/ a# }0 P* E6 y4 q) p 1 rose
2 x1 Z( t& }- k' `* R$ }$ p' f 2 tree5 W8 n7 ] v8 G% J. ]
3 rose
6 E0 r# W0 s3 c: K6 N% d 3 bush
: T: V0 L. _0 n& d& N& X- ~ 3 rose
% @' W0 j4 v1 G+ C! G' c结果:
( Y1 p5 y8 J0 `
1 N# d% q/ a# d+ f- N* i% g
! f+ k* p& g: T/ }/ N5 k5 W8 U* A& s8 Q5 j6 ^
谁能帮忙
8 w# A( o' v6 @6 }, }! `7 B
2 U( l5 v% L. x0 p& a! J4 y解决方案:8 @! X5 E. a5 v. d" c* w
# u4 J: T) X% \0 y$ S# ^2 O& W+ l: D8 R& K6 r$ w
0 k0 Q) m q/ y0 Y9 P! U% h! m! Z
问题是MySQL没有枚举行的好方法。根据MySQL文档,常量的使用不能保证正常工作。它通常可以工作,但是也可能会出现问题。
) E# _# |2 @3 e/ [1 C5 ?( i% u我建议您将这些名称连接到一个字段中。结果如下所示:3 H" e) n7 c* C+ o
1 tree,rose& c* n0 d7 N7 T% N) P/ o) \
2 tree
8 i7 \- w- f1 V7 Q3 tree,bush,rose& N' v/ R* v4 D7 _5 t: i B7 [1 x' V
使用SQL:+ \' B3 i0 g; C) A
select plantid, group_concat(name separator ',') @9 H5 \9 w* m u& p+ X; Z
from t1 j; B! _1 ]+ }) N' P
group by plantid
6 B, D: \# l& N如果您确实希望在单独的列中使用名称,则可以想到两个选项。一种是使用上面的结果,然后将结果解析为单独的字符串。另一种选择是使用自连接和聚合来计算序列号,如下所示:
4 N; V7 k, d* i. _: \select p.plantid, p.name, count(*) as seqnum i6 r3 {& A" g& ^* N: L5 R3 X% b
from t p left outer join1 M* r" X2 W* l) ~6 [
t pprev6 i" B6 d9 p& b# F" W5 Q! ]
on p.plantid = pprev.plantid and
( Z5 U" f+ e7 {" ?3 F p.name >= pprev.name
: }0 S6 W( H- F$ agroup by p.plantid, p.name
5 l! R% W2 e6 L% \1 c. U并将其用作子查询。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|