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

Jon*_*tes 13 mysql sql select join

在MySQL中:

如果我们有两个表:

comments
key    |    value
=================
1      |    foo
2      |    bar
3      |    foobar
4      |    barfoo
Run Code Online (Sandbox Code Playgroud)

和:

meta
comment_key    |    value
=========================
1              |    1
2              |    1
3              |    2
4              |    1
Run Code Online (Sandbox Code Playgroud)

我想从commentcomment_key中获得meta表中具有特定value(表中的valuemeta)对应的注释.

例如,我想选择所有从该行comment有一个表value1meta表:

我期待这些结果:

key    |    value
=================
1      |    foo
2      |    bar
4      |    barfoo
Run Code Online (Sandbox Code Playgroud)

而如果我选择所有从该行comment有一个表value2meta表:

我期待这个结果:

key    |    value
=================
3      |    foobar
Run Code Online (Sandbox Code Playgroud)

我真的希望有人可以提供帮助,谢谢你们提前!

我想我需要加入吗?任何指针都会很棒,如果可能的话,还有一个简短的解释,这样我就可以解决我出错的地方 - >所以下次我会知道!

rua*_*akh 22

我实际上不会为此推荐JOIN - 或者更确切地说,我推荐一个" semijoin ",这是一个不直接用SQL表达的关系代数概念.半连接本质上是一个连接,您只想从一个表中检索记录,但条件是它们在不同的表中具有相应的记录.

在SQL符号,这个概念间接表达,通过使用一个IN子句,具有子查询:

SELECT key, value
  FROM comments
 WHERE key IN
        ( SELECT comment_key
            FROM meta
           WHERE value = 1
        )
;
Run Code Online (Sandbox Code Playgroud)

(MySQL实际上最终会在内部将其转换为半连接 - 实质上是一种退化的内连接 - 但该IN子句是在原始SQL中表达它的自然方式.)

  • @JCooper:我不这么认为.假设对于`parent`中的每个记录,`child`中有零个,一个或多个记录.然后,半连接将包括每个"父"记录的零个或一个副本,而SQL"INNER JOIN"将包括一些"父"记录的多个副本.但我可以按你的方式看待它.在关系代数中,半连接等效于内连接,后跟适当的投影; 所以我们可以把它作为SQL`SELECT`和关系代数投影之间的区别,而不是SQL`INNER JOIN`和关系代数半连接之间的区别. (2认同)