I’m trying to select the ids that have indices “a” and “b” by joining 3 tables, then using WHERE to select the rows I need. The three tables have roughly the following schema:
Table 1: id | name | description Table 2: id | start_time | date Table 3: id | word
I joined the 3 tables on id. Table 3 has a one-to-many relationship, where 1 id corresponds to multiple words:
id | word 1 | apple 1 | bee 2 | abandon 2 | apple 2 | bee
After joining the tables, they would look like
id | name | description | start_time | date | word 1 | 100 | abcd | 1200 | M | apple 1 | 100 | abcd | 1200 | M | bee 2 | 200 | efgh | 2200 | T | abandon ...
My goal would be to select the ids that correspond to both the word “apple” and “bee”, as well as having a specific start time and date. But I can’t use
SELECT id FROM table WHERE start_time = 1200 AND date = "M" AND word = "apple" AND word = "bee"
Because a single row can’t hold both “apple” and “bee”. Can someone explain how to select the ids that correspond to words in two different rows? Thanks!
Advertisement
Answer
This answers the original version of the question.
Use aggregation and having
:
SELECT id FROM table WHERE word IN ('apple', 'bee') GROUP BY id HAVING COUNT(*) = 2;
Note: This assumes that you have no duplicates. If you can have duplicates, use COUNT(DISTINCT word) = 2
.
Here is a db<>fiddle.