1

我有两张桌子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');
4

3 回答 3

3

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

SELECT person_id
FROM interest
WHERE interest_category IN ( 'music', 'movie', 'sport');
GROUP BY person_id
HAVING COUNT(*) = 3;
于 2012-05-30T09:23:58.037 回答
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'
于 2012-05-30T09:15:39.707 回答
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(COLUMN_VALUE)) AS RES
          FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('music', 'movie', 'sport')))
这将计算作为输入提供的值的长度

第二次查询


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

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

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

希望能帮助到你

于 2012-05-30T11:03:03.667 回答