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 | descriptionTable 2: id | start_time | dateTable 3: id | wordI 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 | beeAfter 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 idFROM tableWHERE word IN ('apple', 'bee')GROUP BY idHAVING 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.