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

时间:2012-02-02 00:19:56

标签: mysql sql select join

在MySQL中:

如果我们有两张桌子:

comments
key    |    value
=================
1      |    foo
2      |    bar
3      |    foobar
4      |    barfoo

meta
comment_key    |    value
=========================
1              |    1
2              |    1
3              |    2
4              |    1

我想从comment表中获得comment_key表格中具有特定metavalue的{​​{1}}对应value的评论meta表中的列。

例如,我想从comment表中选择value表中1 meta key | value ================= 1 | foo 2 | bar 4 | barfoo 的所有行:

我期待这些结果:

comment

如果我要从value表中选择2表中meta key | value ================= 3 | foobar 的所有行:

我期待这个结果:

{{1}}

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

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

3 个答案:

答案 0 :(得分:21)

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

在SQL表示法中,使用an IN clause使用subquery间接表达此概念:

SELECT key, value
  FROM comments
 WHERE key IN
        ( SELECT comment_key
            FROM meta
           WHERE value = 1
        )
;

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

答案 1 :(得分:0)

你在这里寻找一个普通的香草等联盟。

SELECT `comment`.`key`   AS `key`,
       `comment`.`value` AS `value`
    FROM `comments` 
        JOIN `meta` 
            ON `comments`.`key` = `meta`.`comment_key` 
    WHERE `meta`.`value` = 1;

我不确定你在这里寻找什么样的建议,但你可以在Wikipedia's SQL JOIN page.

阅读更多关于这个主题的信息(不是特定于MySQL)

我建议在commentkeymetacomment_key上建立索引,两者都是PRIMARY KEY索引,假设您希望只有1 {{1}每meta行的行(根据定义,PRIMARY KEY是UNIQUE)。如果您希望每个comment允许超过1 meta,请向comment添加单独的索引id列,并将meta的主要密钥添加到comment_key b树索引。

我也不确定它的性能如何与列出的“半连接”答案相比,但对我来说,这是表达查询的更简单,更自然的方式;但是,只有两个表,MySQL的优化应该不会太具挑战性。

答案 2 :(得分:0)

我会以下列方式使用“INNER JOIN”:

SELECT comments.key, comments.value FROM comments 
INNER JOIN meta ON comments.key=meta.comment_key WHERE meta.value = 1;

干杯! ; - )