在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
的{{1}}对应value
的评论meta
表中的列。
例如,我想从comment
表中选择value
表中1
meta
key | value
=================
1 | foo
2 | bar
4 | barfoo
的所有行:
我期待这些结果:
comment
如果我要从value
表中选择2
表中meta
key | value
=================
3 | foobar
的所有行:
我期待这个结果:
{{1}}
我真的希望有人可以帮助,提前谢谢你们!
我想我需要加入?任何指针都会很棒,如果可能的话,还有一个简短的解释,这样我就能解决出错的问题 - >所以下次我会知道的!
答案 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)我建议在comment
。key
和meta
。comment_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;
干杯! ; - )