【问题标题】:Finding all ID having all values from other table查找所有 IS 具有来自另一个表的所有值
【发布时间】:2015-04-18 21:50:48
【问题描述】:

在三个表中:

Actors:
+------------------+
| id_a | actor_name|
+------------------+
|   1  | AAA       |
|   2  | Bbb       |
|   3  | Ccc       |
|   4  | Ddd       |
|   5  | Eee       |
+------------------+

Movies:
+----------------+
| id_m | mov_name|
+----------------+
| 1    |   LoR   |
| 2    |  Thron  |
| 3    |   ZsT   |
+----------------+

actors_in_movies:
+-------------+
| id_m | id_a |
+-------------+
| 1    |  1   |
| 1    |  3   |
| 1    |  5   |
| 2    |  1   |
| 2    |  3   |
| 3    |  2   |
| 3    |  3   |
| 3    |  4   |
| 3    |  5   |
+-------------+

是否可以编写一个查询来获取:查询中的演员播放的所有电影?

示例:SELECT id_m WHERE id_a IN (1,3,4,5),应该给出:

+------+
| id_m |
+------+
|  1   |
|  2   |
+------+

然而.. SELECT id_m WHERE id_a IN (1,9) 应该给出 NULL。

我尝试了类似的查询:Finding ID having all values (mySQL, SQL),写了类似的内容:

SELECT id_m, count(*), group_concat(id_a) as all_act 
FROM actors_in_movies 
WHERE
 id_m IN (SELECT id_m FROM actors_in_movies WHERE id_a = 1)
AND
 id_m IN (SELECT id_m FROM actors_in_movies WHERE id_a = 3)
AND
 id_m IN (SELECT id_m FROM actors_in_movies WHERE id_a = 5)
GROUP BY (id_m)
HAVING count(*) <= 3

它只显示一部电影(id_m:1), 如果我使用“或”几乎没问题, 但对我来说重要的是获取所有来自查询演员的电影, 查询演员或更少,从来没有演员在查询中错过的电影。 应该怎么写?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    使用group byhaving

    SELECT id_m
    FROM table
    WHERE id_a IN (1, 9) 
    GROUP BY id_m
    HAVING COUNT(DISTINCT id_a) = 2;
    

    【讨论】:

    • 它有效,但如果我尝试搜索 id_a IN (1, 3, 9, 12, 13, 14) 我没有得到想要的结果 id_m:2。如果我将having 更改为&lt;=6,我会从查询中获取至少有一个 id 的所有电影..
    • 但我需要包含查询中的所有 id 或更少的电影,如果电影的演员多于查询中列出的演员,则它不应该出现在结果中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2018-06-24
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2023-02-21
    相关资源
    最近更新 更多