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

问题描述 投票:0回答:3

在 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
表中具有相应
meta
且具有特定
value
value
表中的
meta
列)的评论。

例如,我想从

comment
表中选择
value
1
的所有行:

我期待这些结果:

meta

如果我要从 
key | value ================= 1 | foo 2 | bar 4 | barfoo

表中选择

comment
表中
value
2
的所有行:

我期待这个结果:

meta

我真的希望有人能帮忙,先谢谢大家了!

我想我需要加入吗?任何指示都会很棒,如果可能的话,一个简短的解释,这样我就可以找出哪里出错了 -> 这样我下次就知道了!

mysql sql select join
3个回答
24
投票
semijoin

”,这是一个不直接用 SQL 表达的关系代数概念。半联接本质上是一种联接,您只想从一个表中检索记录,但条件是它们在不同的表中具有相应的记录。 在 SQL 表示法中,这个概念是通过使用

an

key | value ================= 3 | foobar 子句

子查询: 来间接表达的 IN

(MySQL 实际上最终会在内部将其转换回半连接 — 本质上是一种退化的内连接 — 但 
SELECT key, value FROM comments WHERE key IN ( SELECT comment_key FROM meta WHERE value = 1 ) ;

子句是在原始 SQL 中表达它的自然方式。)

    


0
投票

IN

我不太确定您在这里寻找什么样的建议,但您可以在 
Wikipedia 的 SQL JOIN 页面阅读有关该主题的更多信息(不是特定于 MySQL 的)。

我建议在

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

.

comment
key
.
meta
上建立索引,两者都是主键索引,假设您希望每
comment_key
行只有 1
meta
行(主键是根据定义是唯一的)。如果您希望每个
comment
允许超过 1 个
meta
,请向
comment
添加单独的索引
id
列,并将其设为主键,其中
meta
只是一个 b 树索引。

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


0
投票

comment_key

	
© www.soinside.com 2019 - 2024. All rights reserved.