回答

收藏

SQL:查找行并根据匹配列的数量排序?

技术问答 技术问答 54 人阅读 | 0 人回复 | 2023-09-13

假设我们有一个具有如此简单结构的“汽车”表…
% R) Z5 i3 T  q: ^0 _3 kcar_id INT
' Z8 F" W) w: G8 ?: `/ I3 scolor ENUM('black','white','blue')- z# z: h$ }! W8 V
weight ENUM('light','medium','heavy')
. X2 C; X* U" r6 B* i) y0 ktype ENUM('van','sedan','limo'), h2 w. R1 B% u* D# S3 W$ }
拳头,我选择的是汽车(1,黑色,重型,豪华轿车),然后我想获取相关汽车的列表,这些列表按匹配列的数量排序(没有任何列的权重)。所以,首先我期望看到(黑色,重型,豪华轿车)汽车,然后我期望看到只有2个匹配字段的汽车,等等。
; K2 P& i4 B4 U6 [( E是否可以使用SQL执行这种排序?
1 u8 Q2 U7 O% D7 [3 E; f* Y! e7 ^对不起,我的英语,但我真的希望我对您的问题很清楚。0 X( ?9 ]$ m5 f" O) {
谢谢你。* h( Y& d) f# j' A+ j
                ' {9 r; h* ?% j/ q
解决方案:0 z) G5 h: ~3 s3 ?( k# T. c6 B
                4 P! G3 k! o1 X" z0 ^1 v
6 x& V7 N* V& i! }

! i- `3 S3 l; {6 |6 [6 l                可能有几种方法可以优化子查询,但是不使用case语句或次优联接子句:
' v) q* d3 m( \& b- \8 vselect
8 ?  J) z6 \* z& d6 d0 \9 |* O& M        *
6 _5 d# ~; y1 H- k    from
; R8 J" H( S+ a$ V: S8 ^        (
& \3 c: K6 B% S( Y* F! B  a3 d" k            select( n; T2 ^3 D' ~- u) M
                    selection.CarId,3 `9 ?% J1 J) n1 h! e7 [; C
                    selection.Colour,
- c0 E( M! n2 o+ u                    selection.Weight,9 W( S  F* V/ u" N
                    selection.Type,
$ z8 Y5 B0 M$ g3 i) E2 e2 a% H                    3 as Relevance8 Z4 {: I% }6 ^
                from/ t! R7 u1 k7 J# L0 f
                    tblCars as selection2 g  M- u9 R9 ~, q, q2 k8 i
                where. |( ^& o5 [3 p; i- Y' j$ D
                    selection.Colour = 'black' and selection.Weight = 'light' and selection.Type = 'van'
( f; ]( Z) d) F- o! J1 u, o            union all
0 Z3 ~' Z7 \6 n1 a- j            select& D' e* O2 k* m  o
                    cars.CarId,7 m+ I  M8 j  A1 v* J9 ~
                    cars.Colour,; \3 s) ?* S# [7 u2 f
                    cars.Weight,# H6 I6 y0 \4 o$ r
                    cars.Type,/ p( d0 _% {& l3 c; J
                    count(*) as Relevance) H2 H) @. X: |" \8 E
                from4 c; l5 J7 X/ `8 ?$ A
                    tblCars as cars5 I2 U, V2 o. X1 e; v
                inner join4 s) ~' G4 b, j; k9 c
                    (: N$ h3 W  ^! j( u- g$ O' S) E' k
                        select
/ M9 z) v. m0 }* K- l! {                                byColour.CarId
8 @+ i4 l1 p7 S. o5 X                            from
) n/ W! ?" J5 A1 f                                tblCars as cars2 c8 z& t" }7 Z6 k3 I
                            inner join# X' ]* j4 c1 d
                                tblCars as byColour
" b3 o  J/ V( e; B                            on
9 }/ R6 B- S2 @4 a1 q                                cars.Colour = byColour.Colour
# K+ F( b; V6 k4 @                            where. b& V( l1 p: U, g% [
                                cars.Colour = 'black' and cars.Weight = 'light' and cars.Type = 'van'! A) n9 G9 r) s
                                and# X3 f$ R1 @2 h
                                byColour.CarId  cars.CarId
* \% M+ u+ ]; F! b& F, z  i                        union all
7 N9 B% c7 P; c; m4 l                        select- E9 D+ O/ d" o8 h5 {
                                byWeight.CarId8 D$ p5 a. Y/ c0 ~; O
                            from# p* R  P* @+ L( }5 e6 T: d
                                tblCars as cars
. l9 d* |1 b% J) a                            inner join
3 `$ E5 |( `& a& L$ k! y7 s' [                                tblCars as byWeight- ?  S$ W2 W; S/ Y) O7 d5 |& _5 e
                            on% p: e7 w/ b8 P: _: B
                                cars.Weight = byWeight.Weight1 u. P  o+ d* M1 M) n0 y; n4 Y
                            where
. a, q! U! Y0 N) w. ^( I' f                                cars.Colour = 'black' and cars.Weight = 'light' and cars.Type = 'van'
6 q6 Y  R0 u' Q( Q# Y                                and9 E+ @0 e& M6 z! ~+ [0 n$ W/ g
                                byWeight.CarId  cars.CarId) w% ]0 J1 J5 y
                        union all' Y1 f9 g: N7 R% n, Q
                        select. d6 o2 T. `6 r  L" b7 S
                                byType.CarId
: j2 L8 q( |7 m8 R2 d2 A$ e: D                            from
9 z! U0 h# ^7 I# R# o. V6 w                                tblCars as cars
' U0 ]4 m5 D; T9 l2 x( y' D1 O                            inner join* h. c- h; D" r7 \3 f, f5 \
                                tblCars as byType3 a  s# C+ I0 ~, ^7 |
                            on2 ^; W/ m- Y- N9 C! c" R; m' `% a
                                cars.Type = byType.Type9 h! i* Z8 y8 J8 K4 Z* ~# h
                            where9 q! p0 W3 I0 _. C( F; m* @
                                cars.Colour = 'black' and cars.Weight = 'light' and cars.Type = 'van'
8 u* |, ]- ^- \                                and# l6 v1 ]+ `  f$ }" b( w; b1 _$ b
                                byType.CarId  cars.CarId
# F( ^, @( V$ O5 \8 b- Y                    ) as matches
- ]" a6 S& Z; L                on
  D! X2 ~& I$ U  f/ E                    cars.CarId = matches.CarId
( ?9 `; p+ [: D5 F# Q, M/ ]: ?$ O                group by
) t9 o3 f3 `1 E# k                    cars.CarId,
- J: m: H, \0 S" m. q2 y: o) ]3 U                    cars.Colour,- l9 @8 L' d, t  P  X
                    cars.Weight,% {5 m6 Z' `1 V. R) `8 |  \0 P# y% S
                    cars.Type
7 v* u" Z1 M! W/ D3 W        ) as results
( Z  X0 L! I1 ~0 Q- m. E! _    order by, c5 B/ S% T5 J" {
        Relevance desc
, c' z# P+ ^1 s- ]% A9 |) S输出:4 @. u- P" c. |% p* T2 u5 y
CarId   Colour  Weight  Type    Relevance  g* z1 \( l: s( P9 q0 d" R( g
1       black   light   van     3; H' v- c9 t' {& R
3       white   light   van     2; a2 d& P% L+ P
4       blue    light   van     2
" B, V9 q) h& O) P, |5       black   medium  van     2
6 Q" z$ Z- T8 _4 i  ~# r6       white   medium  van     1  J& z8 l) S* |
7       blue    medium  van     1) z4 G& w  d9 u! o. h
8       black   heavy   limo    1
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则