【问题标题】:SQL Finding similaritiesSQL 查找相似之处
【发布时间】:2021-03-05 11:52:08
【问题描述】:

“确定是否有同名演员出现在同一部电影中。”

这是我的任务,我应该用子查询来做这件事,但我真的不知道还能做什么。我尝试了 group by、order by 和计数的所有方法,但我只是没有达到让相同名字的演员与同一部电影相同的地步。

也许有人可以帮助我?我正在使用 Sakila 数据库

    SELECT 
a.first_name
,(a.last_name)
,a.actor_id
, f.title
FROM actor a 

JOIN film_actor fa ON fa.actor_id = a.actor_id
JOIN film f ON f.film_id = fa.film_id

JOIN(SELECT b.first_name, COUNT(*)
     FROM actor B
     GROUP BY b.first_name
     HAVING COUNT(*) > 1 ) b 
     ON a.first_name = b.first_name
     
     GROUP BY a.last_name
     HAVING COUNT(f.title) > 1
     
     
     
     ORDER BY a.first_name

【问题讨论】:

标签: mysql sql count inner-join


【解决方案1】:

您只能通过连接来做到这一点:

select f.title, a1.first_name, a1.last_name as last_name_1, a2.last_name as last_name_2
from film f
inner join film_actor fa1 on fa1.film_id = f.film_id
inner join film_actor fa2 on fa2.film_id = f.film_id
inner join actor a1 on a1.actor_id = fa.actor_id
inner join actor a2 on a2.actor_id = fa.actor_id
where a1.first_name = a2.first_name and a1.actor_id < a2.actor_id

film 表开始,这将遵循与actorfilm_actor 的关系两次,然后过滤具有相同名字的不同参与者。

因此,您会得到具有相同姓氏并在同一部电影中扮演的演员的元组。不等式条件确保没有“镜像”记录(即每个元组在每部电影中只出现一次)。

【讨论】:

  • 返回元组而不是单个结果的好方法
【解决方案2】:

我会简单地使用聚合:

SELECT fa.film_id, a.first_name,
       GROUP_CONCAT(a.last_name) as last_names,
       GROUP_CONCAT(a.actor_id) as actor_ids
FROM actor a JOIN
     film_actor fa
     ON fa.actor_id = a.actor_id
GROUP BY fa.film_id, a.first_name
HAVING COUNT(*) > 1;

您的问题未指定结果集的外观。这将为电影中具有相同名字的每个演员返回一行。姓氏与演员 ID 一样连接成一个字符串。

【讨论】:

  • 好看,简单好用
【解决方案3】:

这个怎么样:

SELECT f.title, f.film_id, a.first_name, a.last_name, a.actor_id
FROM actor a 
JOIN film_actor fa ON fa.actor_id = a.actor_id
JOIN film f ON f.film_id = fa.film_id
WHERE a.first_name IN (
         SELECT a2.first_name
         FROM actor a2
         JOIN film_actor fa2 ON fa2.actor_id = a2.actor_id
         JOIN film f2 ON f2.film_id = fa2.film_id
         WHERE a2.actor_id <> a.actor_id AND f2.film_id = f.film_id
)
ORDER BY f.title ASC, a.last_name ASC, a.first_name ASC

逐步解释查询

SELECT来自连接表的所需字段

JOIN必要的表格

WHERE(这里是子查询)a.first_name 在以下集合中:

演员的名字,不同于当前演员 (a2.actor_id &lt;&gt; a.actor_id) 和电影相同 (f2.film_id = f.film_id)

where 中的子查询是与父查询类似的带有连接查询的 select。

PS:

可以在这个基本查询模板上做一些变化:

  1. 例如film_id 可以作为参数给出,因此可以找到特定电影的所有同名演员。
  2. 还可以groupcount 有多少演员出现在同名电影中,例如通过film_id 分组并计数。
  3. 甚至可以通过删除不必要的连接来优化查询(例如,film.title 可能根本不需要)等等..

返回单个结果(而不是元组或聚合)的优势在于,同一部电影中同名演员的数量不是固定的,并且操纵结果(例如通过分组和计数或获取每个演员的更多信息)是更容易。

价格是一个稍微复杂且可能更慢的查询。

【讨论】:

  • 乍一看,它确实有效。您能解释一下您的查询吗?我在这个练习中真的很挣扎,因为我刚开始写 SQL
猜你喜欢
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 2020-11-28
  • 1970-01-01
  • 2014-03-20
  • 2014-06-05
相关资源
最近更新 更多