MySQL Select ID's which occur on different rows with multiple specific values for a column

前端 未结 5 833
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-16 20:21

I\'m trying to select items from an associative table that have satisfy two or more values of the same field, sounds confusing, let me explain.

+------------         


        
相关标签:
5条回答
  • 2020-12-16 20:56

    Assuming each item_id, category_id is unique,

    select *, count(item_id) as c from item_category
    where category_id in (201, 202)
    group by item_id
    having c = 2;
    

    Replace c = 2 with c = (count of categories)

    0 讨论(0)
  • 2020-12-16 21:00

    Your expression in a WHERE clause works against a single row of the joined result set. That's why WHERE category_id = 201 AND category_id = 202 doesn't work -- because it can't be two values on a single row.

    So you need some way to join two rows from the table into one row of the result set. You can do this with a self-join:

    SELECT c1.item_id
    FROM item_category AS c1
    INNER JOIN item_category AS c2 ON c1.item_id = c2.item_id
    WHERE c1.category_id = 201 AND c2.category_id = 202
    

    This technique is hard to scale up when you want to search for three, four, five or more values, because it requires N-1 joins to match N values.

    So another method is to use GROUP BY:

    SELECT c.item_id, COUNT(*) AS cat_count
    FROM item_category AS c
    WHERE c.category_id IN (201,202)
    GROUP BY c.item_id
    HAVING cat_count = 2
    

    Both techniques are okay, and work better in different circumstances.

    0 讨论(0)
  • 2020-12-16 21:04

    I don't have the time to provide the exact query right now, but try something like this:

    select item_category.* from 
    item_category ,  item_category ic1, item_category ic2 where 
    ic1.category_id = 201 and 
    ic2.category_id = 202 and 
    ic1.item_id = ic2.item_id and 
    item_category.item_id = ic1.item_id and 
    item_category.item_id = ic2.item_id;
    

    Maybe conditions are wrong but you can try something this way.

    0 讨论(0)
  • 2020-12-16 21:06

    Use either a JOIN, or a GROUP BY:

    SELECT category_id, fieldhere, anotherfield
    FROM item_category
    WHERE category_id in (201,202)
    GROUP BY category_id
    HAVING count(category_id) = 2
    
    0 讨论(0)
  • 2020-12-16 21:09

    You could try:

    SELECT * FROM item_category WHERE category_id IN (201, 202, ...)

    (or, as the comments say... you may not.)

    0 讨论(0)
提交回复
热议问题