|
我正在尝试一次从三个表中检索数据。这些表如下所示:
; ?* _; ]8 P# s2 l' \+ N5 f类别
- n' `6 I* A/ N# L1 pid
. d+ j2 j3 ]; C! @category
. o9 g4 {+ ^: o& w9 E. r: Z1 H" ?messageid- \; f' m3 B. ?; N
讯息
( u$ w4 R9 T9 L; @$ u6 Yid7 j5 z) j( A( t$ I8 K+ D [7 J2 t
title
2 L, B7 x; i' o% Z) ? xmessage1 i1 P6 ]; a0 F4 W3 Z5 E/ o+ K
评论+ S+ J: `5 v3 v9 E; i; N8 P
id. U3 U7 a: k: g
messageid
+ k6 Y' r! r7 Y5 s" t7 {message
$ w- H& h' t' d8 F; h我想要得到的是1条消息(因为我有一个WHERE基于id的子句3),3个类别(因为有3个类别链接到消息)和2条注释(因为有2条注释链接到消息)。4 E. x/ {; o6 T
我正在尝试使用以下查询来检索数据:* @7 s' t0 c0 p$ p l
SELECT categories.category, messages.id, messages.title, messages.message, comments.count, comments.id as commentid, comments.message as commentmessage9 _( t( M7 I* u2 M: I( z$ `5 J0 U3 B
FROM categories' L( D) d* c' J; \- w, Y7 y
RIGHT JOIN & Z1 ]3 q7 K4 x, [+ k
(SELECT id, title, message
! Q* Q+ N; b5 `. e; h( |% G @ FROM messages WHERE messaged.id = 3) messages1 V$ o$ k z( l
ON messages.id = categories.messageid3 [# ~# f3 T) A. }* Y" p( T+ ]
LEFT JOIN' D, |. L B% b0 w1 i8 h
(SELECT count(id), id, message
/ f, B* p9 O7 k* u, d; n! O. o FROM comments
3 S; c. V' F U* v2 g GROUP BY id, message) comments
9 v. ~% y9 Q2 Y% z+ P" r; mON messages.id = comments.messageid* a0 j2 X" }$ _" z. W
ORDER BY article.id DESC9 l/ G" \* G, z) T$ q
但是,当运行此查询时,我得到6个结果:
+ q! d8 _- d9 _9 A4 Scategory id title message count commentid commentmessage- S3 _7 U7 T& V
test 3 the title the message 1 6 comment 14 e' D4 u; a/ h' c8 G, _" t
test 3 the title the message 1 5 comment 2
. H8 A: m5 `4 C( ]$ S9 r0 @4 b0 f6 v Ginstallation 3 the title the message 1 6 comment 1
3 {+ B/ [# k O ^4 Vinstallation 3 the title the message 1 5 comment 2
0 g7 Q! P. D0 M# w# ?* H" ]: oquestion 3 the title the message 1 6 comment 1/ I2 u8 O A* e
question 3 the title the message 1 5 comment 26 _& g: j# G0 r6 ]5 k
在我预期结果如下的地方:
; E! G, X% T3 Q6 Dcategory id title message count commentid commentmessage; ?* T8 J: {) s8 U
test 3 the title the message 1 6 comment 1
8 x& S3 N' N3 R5 Uquestion 3 the title the message 1 5 comment 2( {8 ?0 ] l) }
installation 3 the title the message 1 null null
Y/ c" i% p+ ?' {! b# @0 |" w只有三行,我应该能够获取所有需要的数据。这有可能吗?我做错了吗??* H' o, G1 G3 j7 L$ q
% S: R6 X8 I% D" a/ I8 K解决方案:# G4 V- {; O# I* a
) Z/ U ~3 {# U3 u! B; r1 D1 d
: I: c# v! Z& k
# j S3 Z$ K& s/ C 如评论中所述,这里有几个问题。
3 `/ `1 u3 e# A h4 \( i( L- R/ K' [首先,由于您要联接三个表,因此您得到的答案是正确的。1 x 2 x 3行= 6。
% n) i$ ~; O6 E& T7 H# o0 u其次,您对评论的汇总实际上并没有汇总任何内容。正如您在结果中看到的那样,计数始终为1,而我希望您认为两个评论为2。由于您要对ID进行分组,因此将对每个唯一ID(始终为1)执行计数。我想您可能想对messageid进行分组
8 C$ v( O; r) ]4 ?7 @SELECT count(*), messageid6 X7 L" u3 U7 c5 t" d
FROM comments
0 P/ g$ K1 X8 Q: b6 ]2 o4 `1 H, BGROUP BY messageid
- P. E( f2 ~( d& N' f a! `您将需要进行其他联接或单独的查询才能获取评论本身。- t. a. u6 B" h: I
同样,正如评论中所讨论的那样,您通常不会以这种方式获取信息。您通常只需进行三个查询,因为其中两个关系是一对多的。如果类别很短(并且您正在使用SQL% X/ d6 T! y/ L/ \4 X% V: p* b
Server),则可以将类别压缩到自己的列中(即“测试,安装,问题”)。这是您将如何做的。
8 \ p8 s2 |( W( `) g" [- K* Nselect id, title, message,
% Q+ Q# T1 H7 L8 R3 R3 B+ J (select CAST(category + ', ' as nvarchar(max))
3 b- m1 z6 l: i from @Categories c where messageid = m.id; b+ X' ~9 Q, F, E! b/ Y! ^
for xml path('')) as Categories0 _; i) {6 _7 ]- S9 ~0 a
from @Messages m
& z5 C: P0 l- Y5 l8 kwhere m.id = 3
. q. C) J8 c) H$ a/ R+ l- Q实际上,有几种方法可以做到这一点,但这既快速又肮脏。这样一来,您只需要对查询再进行一次查询即可。您可以加入上一个查询,并像这样在两行中获取所有信息% [/ R0 n- F% F4 q/ H7 s; Y# E
select m.id, title, m.message,9 o1 V7 ?8 i- h S
(select CAST(category + ', ' as nvarchar(max))
0 B- F @3 m" L+ Z4 W% _ from @Categories c where messageid = m.id
% _6 m+ M( _( U- ?+ C for xml path('')) as Categories,/ r% R" G3 c. p% Z$ o
cm.message
, }. z' s I: A. O, p1 ~/ o4 L0 qfrom @Messages m
; i9 m. J- K. `, {3 yleft outer join @Comments cm on m.id = cm.messageid
: A c- P( i& o- C% Swhere m.id = 3+ m' N. r) t0 W3 S' Z/ |8 _
但同样,您可能只想再进行一次查询以避免重复信息。 r9 b) R7 z5 m6 p% m! p) |, z$ H" n
最后,我想展示一下您可能希望如何进行评论计数。. F }" `* m, @5 [
select m.id, title, m.message,
% U) ]1 {/ @$ M: v2 U; [ (select CAST(category + ', ' as nvarchar(max))
* X; V4 t$ @ ?7 C from @Categories c where messageid = m.id. s4 `3 } {6 ]% d
for xml path('')) as Categories, |) N. ?1 a& D% \
CommentCount,% N1 l: R" M6 L( U) m- u. X
cm.message
) h) o% [9 x. w- M2 K3 d, Sfrom @Messages m1 e, F- h: S; D/ x5 N# c
left outer join 0 k; A4 F# x% G6 ^( ~
( . s- o; y2 R! t, m: d
select messageid, COUNT(*) CommentCount
+ J1 o. Z$ s% Q/ b- ^' S from @Comments 0 M4 _: u' ^. ?% @6 `/ G* I; c5 r
group by messageid
5 @. t% Q1 {$ S" c8 F) rsCommentCount on rsCommentCount.messageid = m.id |
|