In MySQL:
If we have two tables:
comments
key | value
=================
1 | foo
2 | bar
3 | foobar
4 | barfoo
and:
meta
comment_key | value
=========================
1 | 1
2 | 1
3 | 2
4 | 1
I want to get the comments from the comment
table that have a corresponding comment_key
in the meta
table that have a specific value
(the value
column in the meta
table).
For example, I'd like to select all the rows from the comment
table that have a value
of 1
in the meta
table:
I'd expect these results:
key | value
=================
1 | foo
2 | bar
4 | barfoo
And if I were to select all the rows from the comment
table that have a value
of 2
in the meta
table:
I'd expect this result:
key | value
=================
3 | foobar
I really hope someone can help, thank you all in advance!
I think I need to do a join? Any pointers would be great, and if at all possible, a short explanation so I can work out where I was going wrong -> so I'll know for next time!
I actually wouldn't recommend a JOIN for this — or rather, I'd recommend a "semijoin", which is a relational-algebra concept not directly expressed in SQL. A semijoin is essentially a join where you want to retrieve records from only one table, but with the proviso that they have corresponding records in a different table.
In SQL notation, this concept is expressed indirectly, by using an IN
clause, with a subquery:
SELECT key, value
FROM comments
WHERE key IN
( SELECT comment_key
FROM meta
WHERE value = 1
)
;
(MySQL will actually end up translating that back into a semijoin internally — essentially a sort of degenerate inner-join — but the IN
clause is the natural way to express it in raw SQL.)