Jag har inte satt mig in din modell och den verkar heller inte fullt ut beskriven eftersom jag inte kan se ingredient_brand men jag ska ändå försöka mig på att svar lite.
Kod:
SELECT i.name
FROM ingredient i
JOIN tag_to_ingredient tti on i.ingredient_id = tti.ingredient_id
JOIN tag t on tti.tag_id = t.tag_id
WHERE t.name in ('tag1namn', 'tag2namn')
GROUP BY i.name
Och din fråga:
När jag använder exemplet ovan så får jag ingredienser som är taggade med bägge taggarna men även ingredienser taggade med antingen eller. Editerade det enligt nedan ifrån en annan sida men jag förstår ej exakt vad den gör. Filtrerar den helt enkelt bara ut dem som har exakt båda träffarna? Eller räknar den bara sista träffen?
Så kanske detta är begripligt:
IN ger dig alla rader där t.name är lika med 'tag1namn' eller 'tag2namn'
Det är det samma som: Undanta alla rader där t.name inte är lika med 'tag1namn' eller 'tag2namn'
Finns det flera rader med ett och samma t.name som är något av 'tag1namn' eller 'tag2namn' så kommer dessa med i ditt resultat.
Vill du bara ha unika t.namn så kan man använda DISTINCT eller GROUP BY, HAVING COUNT(*) är frivilligt villkor som används tillsammans med GROUP BY för att begränsa vilka grupper man vill ha och då gäller det antalet per grupp.
Enkelt exempel:
Du hur personer med namn tabellen person där samma namn kan förekomma flera gånger, nu vill du veta vilka namn som är unika, alltså som bara förekommer n gång
SELECT namn FROM person group by namn HAVING COUNT(*) = 1
Du vill veta vilka namn som förekommer ett visst antal gånger, säg 3
SELECT namn FROM person group by namn GROUP BY namn HAVING COUNT(*) = 3
Om du vill veta alla namn och bara se varje man en gång så:
SELECT DISTINCT namn FROM person
eller
SELECT namn FROM person GROUP BY namn
Vill du veta hur många gånger varje namn finns så:
SELECT namn,count(*) FROM person GROUP BY namn