回答

收藏

sql查询以通过标签确定最相似的商品

技术问答 技术问答 187 人阅读 | 0 人回复 | 2023-09-14

我正在一家电子商店,所以我有3张桌子:
" B& f; O' m) y  l+ j9 v1) goods: b; X$ }& o; q6 w! p
id      | title6 ?9 C/ ^. K7 u
--------+----------- / G4 l" D6 H' j5 V8 M# Y
1       | Toy car
  S, P2 d0 r# j& O2       | Toy pony1 e7 q1 f$ e4 P: p/ J0 [6 y" y
3       | Doll! x- D9 b+ I4 {; n1 E, H
2) tags( ?6 p6 n) U' Q/ Y) N  M
id      | title
7 R, a* X, c+ y8 M* a--------+-----------
9 P( p% T' E3 r1       | Toy8 Z4 g" V! D! s; z( B
2       | Boys& h; [! [. O5 q" u& S3 k0 k
3       | Girls
4 I# R! Z" m  K. ]* }3) links9 R1 O# U4 [2 `$ X% X1 u6 I
goods_id| tag_id
, @5 ~- P  |' U. \+ d' [# d; h/ F--------+----------- 9 I- v0 y7 @+ ?( N, \8 V8 r
1       | 1# E4 b* U* Z0 h7 w3 K5 ]
1       | 2. R( w$ I. [, W3 ^( A, K
2       | 1
2 B1 k2 U& k9 I  n1 M2       | 24 a  ~9 @) W( R4 P5 x% ^
2       | 3
) V& N$ _4 u) u! C3       | 3
1 e9 t. l3 V7 r0 F) i: O/ u0 S; c所以我需要使用这种算法打印相关商品:使用标签获取与所选商品最相似的商品。最多的标签是相互的-最合适的项目是
; ^1 X- @5 N  }7 P因此,的结果goods#1应为:goods#2,goods#3
3 V8 R4 ?1 f. h% Z5 H) `. w& L) m对于goods#2:goods#1,goods#3
7 w# Z0 K' h- S( F; T, S对于goods#3:goods#2,goods#1
) s+ }/ j* o& r  z1 G" {而且我不知道如何通过一个查询按相互标记的数量来排序相似的商品; U, L6 c5 N+ _2 t, m
                % L! d" F- _3 N2 _. y3 _! ?& ?
解决方案:+ a' Z' C. b7 f: R8 _
                2 S7 p8 L* o1 O# y3 H# |
1 U) ~1 }$ m( s$ r! E4 h' J
/ f$ X; A  z$ s: P6 Y4 W$ }0 w
                此查询将返回所有具有最大标签数的物品:
$ s# G& w! s$ q0 _1 [SET @item = 1;# F1 @% M- t" ]6 t
SELECT1 E$ O  a, ~; q- V
  goods_id
. k7 G9 R) Y) \6 x/ g7 C# w! LFROM
) c8 W& X+ @! D+ P  links
3 A+ {; v  {4 u* WWHERE
9 A8 s- g1 k- [  tag_id IN (SELECT tag_id FROM links WHERE goods_id=@item)' W; ]. W3 F) S6 p2 a) D
  AND goods_id!=@item1 g% E5 q; }; M* M3 n
GROUP BY
/ s: C) w3 a3 ^* T! ^  goods_id' A. s- t: Z' a4 F& l$ \
HAVING9 O$ Z' B1 |, B# m4 j+ x5 k9 j
  COUNT(*) = (
- z# \& `! J' ^+ i- q$ }, |, M    SELECT
7 A" i- d& f. m- v" O      COUNT(*)
- N# w% f0 {1 U4 J: @0 n8 N    FROM1 s$ J! T& T  Z' C8 j
      links
4 p' w6 {3 [$ q/ v9 f    WHERE
, l; u! d8 @+ G      tag_id IN (SELECT tag_id FROM links WHERE goods_id=@item)' Q7 z( i/ b2 H! \2 I- X: m
      AND goods_id!=@item# N1 G/ y6 _! Y9 q
    GROUP BY4 }( n/ Z: ]& N- _8 g/ h
      goods_id1 c. g& h0 `( u: S6 Z" P
    ORDER BY" [+ a7 L/ ]( x9 c; s# i" }
      COUNT(*) DESC
$ x: b" b' A$ J0 ~) H9 O7 L" R- P    LIMIT 1% ^# Y' `$ Y1 {7 L+ y
  )
8 I  Y7 y3 w$ s  ~请看这里的小提琴。
! u* t& b0 t" X" C! D% m否则,这将返回所有项目,即使没有共同标签的项目也按共同desc中的标签数排序:
  w" A1 d( f* uSELECT
  ^" P* w' P8 d+ e9 u  goods_id; }8 r$ |' e( S, V" I
FROM* T) r/ W( Y8 ]
  links
/ i. _! E6 V* B9 c( A4 E( t9 JWHERE: E* G1 I, [& {2 s6 @! w! S
  goods_id!=@item$ N+ |4 T  A* Y! X
GROUP BY2 a0 ]) Z6 B' b- f% Y8 g3 y7 N2 [: f: k
  goods_id
" d" D4 I( U: b) p' y8 AORDER BY! w: j2 |6 P5 K6 m# c& _5 n
  COUNT(CASE WHEN tag_id IN (SELECT tag_id FROM links WHERE goods_id=@item) THEN 1 END) DESC;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则