Ok, I think I might be overlooking something obvious/simple here... but I need to write a query that returns only records that match multiple criteria on the same column...
My table is a very simple linking setup for applying flags to a user ...
ID contactid flag flag_type
-----------------------------------
118 99 Volunteer 1
119 99 Uploaded 2
120 100 Via Import 3
121 100 Volunteer 1
122 100 Uploaded 2
etc... in this case you'll see both contact 99 and 100 are flagged as both "Volunteer" and "Uploaded"...
What I need to be able to do is return those contactid's ONLY that match multiple criteria entered via a search form...the contactid's have to match ALL chosen flags... in my head the SQL should look something like:
SELECT contactid
WHERE flag = 'Volunteer'
AND flag = 'Uploaded'...
but... that returns nothing... What am I doing wrong here?
You can either use
GROUP BY
andHAVING COUNT(*) = _
:(assuming
contact_id, flag
is unique).Or use joins:
If the list of flags is very long and there are lots of matches the first is probably faster. If the list of flags is short and there are few matches, you will probably find that the second is faster. If performance is a concern try testing both on your data to see which works best.
AND
will return you an answer only when bothvolunteer
anduploaded
are present in your column. Otherwise it will returnnull
value...try using
OR
in your statement ...Sometimes you can't see the wood for the trees :)
Your original SQL ..
Should be:
your code :
will not work, for you did not declare the table name. the execution will return an error message.
and if you want both search query to display, your code should look something like this.
and not like this because it will always return false SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' AND flag = 'Uploaded';
you can also do this
(asc for ascending order, you can also change it to desc if you want it to display in descending order)
Change AND to OR. Simple mistake. Think of it like plain English, I want to select anything with that equals this or that.
Consider using INTERSECT like this:
I think it it the most logistic solution.