简体   繁体   中英

mysql distinct column on multiple row conditions

I have a mysql database (item_preset) with the following table:

+-----+-----------+---------+-------+ 
| id  | preset_id | item_id | value |
+-----+-----------+---------+-------+
| 1   | 1         | 1       | 2     | 
| 2   | 1         | 2       | 1     | 
| 3   | 1         | 4       | 60    | 
| 4   | 1         | 3       | 16    | 
| 5   | 1         | 3       | 17    | 
| 6   | 1         | 3       | 18    |
| 7   | 1         | 3       | 25    |
| 8   | 1         | 3       | 26    | 
| 9   | 1         | 3       | 27    | 
| 10  | 2         | 1       | 3     | 
| 11  | 2         | 2       | 0     | 
| 12  | 2         | 4       | 0     | 
| 13  | 2         | 3       | 16    | 
| 14  | 2         | 3       | 17    | 
| 15  | 2         | 3       | 19    | 
| 16  | 2         | 3       | 20    | 
| 17  | 2         | 3       | 21    | 
| 18  | 3         | 1       | 2     | 
| 19  | 3         | 2       | 0     | 
| 20  | 3         | 4       | 0     | 
| 21  | 3         | 3       | 25    | 
| 22  | 3         | 3       | 28    | 
| 23  | 4         | 1       | 1     | 
| 24  | 4         | 2       | 1     | 
| 25  | 4         | 4       | 120   | 
| 26  | 4         | 3       | 16    | 
| 27  | 4         | 3       | 17    |         
| 28  | 4         | 3       | 18    | 
| 29  | 4         | 3       | 22    | 
| 30  | 4         | 3       | 23    | 
| 31  | 4         | 3       | 24    | 
| 32  | 6         | 1       | 3     | 
| 33  | 6         | 2       | 1     | 
| 34  | 6         | 4       | 90    | 
| 35  | 6         | 3       | 18    | 
| 36  | 6         | 3       | 22    | 
| 37  | 6         | 3       | 23    | 
| 38  | 6         | 3       | 24    | 
| 39  | 6         | 3       | 29    | 
| 40  | 6         | 3       | 30    | 
+-----+-----------+---------+-------+

What I would like to do is get the distinct preset_id based on conditions from multiple rows. eg to get preset_id 1 i need all the conditions to be true (item_id = 1 and value_id = 2), (item_id = 2 and value = 1), etc...

I have tried usintg the following: select distinct preset_id from item_preset where (item_id = 1 and value = 2) and (item_id = 2 and value = 1) and (item_id = 4 and value = 60);

but get an Empty Set. If I try with Or's instead of and I get all preset_ids that match any of the conditions.

Any Ideas?

Thanks

You might want to try this thing,

SELECT   preset_id
FROM    tableName
WHERE   (item_id = 1 and value = 2) OR 
        (item_id = 2 and value = 1) OR
        (item_id = 4 and value = 60)
GROUP BY preset_id
HAVING COUNT(*) = 3

SQLFiddle Demo

More brackets,

select distinct(preset_id) from item_preset where ((item_id = 1 and value = 2) or (item_id = 2 and value = 1) or (item_id = 4 and value = 60));

and value is a keyword - don't use value as a column name

You can try something like this:

    select distinct preset_id from item_preset 
where preset_id in (select preset_id from item_preset where item_id = 1 and value = 2) 
and preset_id in (select preset_id from item_preset where item_id = 2 and value = 1) 
and preset_id in (select preset_id from item_preset where item_id = 4 and value = 60);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM