如何使用IN运算符但使用AND条件

时间:2012-05-30 09:00:46

标签: mysql sql

我有两张表PersonInterest

Person表格结构

Id | Name

Interest表格结构

Id | Person Id | Interest Category

我的问题是如何让那些喜欢“音乐”和“电影”以及“运动”类别的人。该类别将是动态的。

所以它会喜欢使用IN运算符,但是在IN运算符中使用AND条件而不是OR条件。

SELECT `Person Id` FROM Interest
WHERE `Interest Category` IN ('music', 'movie', 'sport');

3 个答案:

答案 0 :(得分:3)

您可以使用HAVING COUNT。这个数字也必须是动态的。

SELECT person_id
FROM interest
WHERE interest_category IN ( 'music', 'movie', 'sport');
GROUP BY person_id
HAVING COUNT(*) = 3;

答案 1 :(得分:2)

SELECT DISTINCT p.id
FROM Person p
JOIN Interest i1 ON p.id = i1.person_id AND i1.interest_category = 'music'
JOIN Interest i2 ON p.id = i2.person_id AND i2.interest_category = 'movie'
JOIN Interest i3 ON p.id = i3.person_id AND i3.interest_category = 'sport'

答案 2 :(得分:0)

试试这个


SELECT DISTINCT DECODE(A.RES, B.RES, I.INTEREST_CATEGORY, 'FALSE') AS FINAL_RES
  FROM INTEREST I,
       TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport')),
       (SELECT LENGTH(WM_CONCAT(COLUMN_VALUE)) AS RES
          FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport'))) A,

   (SELECT LENGTH(WM_CONCAT(DISTINCT I.INTEREST_CATEGORY)) AS RES
      FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport')),
           INTEREST I
     WHERE I.INTEREST_CATEGORY = COLUMN_VALUE) B

WHERE I.INTEREST_CATEGORY = COLUMN_VALUE

此查询包含2个部分

   (SELECT LENGTH(WM_CONCAT(DISTINCT I.INTEREST_CATEGORY)) AS RES
      FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport')),
           INTEREST I
     WHERE I.INTEREST_CATEGORY = COLUMN_VALUE) B
这将计算作为输入

提供的值的长度

第二个查询


(SELECT LENGTH(WM_CONCAT(COLUMN_VALUE)) AS RES
          FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport')))
计算与数据库条目匹配的类别的长度。

然后最终比较这两个长度并返回ID。

这是完成这项工作的一个很长的方法,但是如果您不想使用group by(编码小得多),这可能是您查询的方法。

希望有所帮助

相关问题