回答

收藏

从表中选择行,其中另一个具有相同ID的表中的行在另一列中具有特定值

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

在MySQL中:
( t3 q8 n; n* V( B如果我们有两个表:# K" [6 d6 Z/ n$ g3 y" h5 b
comments
# f# A; U' k0 `' f1 l; Mkey    |    value& d+ L: P: [& X1 p& J; K8 n) i" r* K# v
=================
3 o: E! }$ s4 c5 h% ]1      |    foo
2 ]5 L# Y/ b9 \# c3 R2      |    bar% u- n# h( n, b+ j. Q0 C
3      |    foobar2 P6 ^9 \1 d# i* Y, Z' t+ M
4      |    barfoo0 o5 b+ y" w, v; [) A
和:
! H* Q1 X9 W9 y! _6 q2 o( F& hmeta: s" ?% m/ O3 {: b. j
comment_key    |    value: R( ]' \: Q. x0 n
=========================
9 ^% r, d( _6 h7 b& \+ N6 C1              |    1
3 y7 h, L2 I+ ]* h& v& v2              |    1' `8 f4 T. L: `  ~
3              |    2/ d0 n3 ~/ r; a3 k3 U
4              |    16 k* L& a: Q' F! _% d' k3 r
我想从意见comment表中具有相应comment_key的meta具有特定表value(该value列meta表)。8 m& N* z6 a" ^
例如,我想选择所有从该行comment有一个表value中1的meta表:1 B4 x2 [0 V9 C
我希望这些结果:
2 h. A7 }8 u' L$ V' N/ K( S& ^$ ykey    |    value
, ]) H. D- `& M" T=================* [3 {6 d: k+ g$ e: e4 c
1      |    foo2 S) w* d( N# \  P) i, x$ ]1 ^& H
2      |    bar2 n! z' [6 E. ]) U2 Y7 M; s* L9 R+ y
4      |    barfoo) V, {5 t5 O4 g
而如果我选择所有从该行comment表中有一个value的2在meta表:
3 N8 S- G/ _" x+ s我希望得到这样的结果:
$ a: c, r! l! _. m" Pkey    |    value$ \" P) q* B" _: A, E, A  }
=================
# n5 r! V. v" Y' R7 h! @+ Y& m, V. n3      |    foobar& S0 T- C. d  K- a6 s! r
我真的希望有人能提供帮助,谢谢大家!
& }% S" K  N: i" W. d7 H我想我需要参加吗?任何指针都将是很好的,并且如果可能的话,可以做一个简短的解释,以便我可以找出我要去的地方->这样我下次就知道了!
: S: m/ ?  N  d' L                ) x* N$ m  `, B: J* J% i. j
解决方案:' R/ T& Z, \0 b4 u2 N
               
1 w7 o8 N3 E9 W2 E
5 Z2 m5 \6 f1 M# }) }& {4 \# x0 W) _& \' B2 H2 ^: M' |, l/ A0 }+ ]
                实际上,我不建议为此使用JOIN-& d8 ]/ C! d4 H0 @
或更确切地说,我建议使用“半联接”,这是一个关系代数概念,未在SQL中直接表达。半联接本质上是一种联接,您只想从一个表中检索记录,但前提是它们在不同的表中具有相应的记录。
2 r& j% g' y, l; O在SQL符号,这个概念间接表达,通过使用一个IN子句,具有子查询:
5 s  n9 R' F+ H; SSELECT key, value
; Y3 h% M4 S5 `' r: n  FROM comments
( z0 s% S" T8 M" H WHERE key IN6 T# E0 H4 d4 U" W; S% O& B
        ( SELECT comment_key0 @* S( n  [& X5 q6 |1 t
            FROM meta
5 F( Q# W5 m; d6 p3 A* Z) l           WHERE value = 1. v! J8 C' w3 s% a% }
        )3 Y+ w7 ~, z6 ]0 N/ |
;- }# p% |# ]$ {/ E$ Q- ]
(MySQL实际上最终会将其内部翻译回半联接-本质上是一种简并的内部联接-但该IN子句是在原始SQL中表达它的自然方式。)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则