Search code examples
sqlmysqlgroup-byaggregatehaving

MySQL query with GROUP BY and HAVING all search values in aggregate


I've got three tables.

Table 1 is packages. Table 2 is package_to_keyword. Table 3 is keywords.

Packages can be connected to multiple keywords. So if I query package_to_keyword Joining keywords and packages I can search for all packages that relate to a certain keyword. That's the part I understand. enter image description here

NOW... my question is, how do I retrieve packages that match a LIST of keywords? Right now, in php, I loop a sql statement and then loop through all the results for each keyword and do an array_intersect() to filter down to the packages that show up in all the result sets. However, I'm sure this is bad, because I'm running a query for each keyword when I'm certain SQL is built to handle this type of relationship, I'm just not sure what type of query to perform.

The key is the list of keywords can be any number of words. If I use something like IN ('keyword','array','returns','all','results') I just get a list for all the packages that have a relationship with ANY of the keywords when I just want packages that have a relationship with ALL of the keywords.

Thoughts?


Solution

  • select title
    from packages p
    inner join pack_to_tag pt on p.index = pt.pIndex
    inner join keyworks w on w.index = pt.kindex
    where word in ('keyword','array','returns','all','results')
    group by title
    having count(*) = 5