在 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
我真的希望有人能帮忙,先谢谢大家了!
我想我需要加入吗?任何指示都会很棒,如果可能的话,一个简短的解释,这样我就可以找出哪里出错了 -> 这样我下次就知道了!
”,这是一个不直接用 SQL 表达的关系代数概念。半联接本质上是一种联接,您只想从一个表中检索记录,但条件是它们在不同的表中具有相应的记录。 在 SQL 表示法中,这个概念是通过使用
ankey | value
=================
3 | foobar
子句
和子查询: 来间接表达的
IN
(MySQL 实际上最终会在内部将其转换回半连接 — 本质上是一种退化的内连接 — 但
SELECT key, value
FROM comments
WHERE key IN
( SELECT comment_key
FROM meta
WHERE value = 1
)
;
子句是在原始 SQL 中表达它的自然方式。)
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 来说优化应该不会太有挑战性。
comment_key