MySQL的新手,我陷入了SAKILA练习

时间:2018-12-19 09:57:57

标签: mysql sql

一个月前我开始学习SQL,发现了SAKILA这项作业,并认为我应该尝试一下以测试自己。我在做运动时有些卡住,我不知道自己在做错什么。有人可以帮我吗?

问题是:

  

查找所有名字和ID为8的演员的名字相同的所有演员的名字(姓和名)。不要返回ID为8的演员的名字。请注意,您不能将ID为8的角色名称用作常量(仅ID)。解决此问题的方法不止一种,但是您只需要提供一种解决方案即可。

我的代码是:

1。

SELECT customer.first_name,customer.last_name FROM customer

LEFT JOIN actor ON (customer.first_name LIKE actor_id=8) 
            AND (actor.first_name LIKE actor_id=8)

2。

SELECT customer.first_name,customer.last_name FROM customer

LEFT JOIN actor ON customer_id=actor_id

WHERE (customer.first_name LIKE actor_id=8) AND (actor.first_name LIKE actor_id=8)

我得到了很多返回的名字,但是没有一个是正确的名字。我究竟做错了什么?为什么代码未返回与演员ID为8的相同名称。

3 个答案:

答案 0 :(得分:3)

由于您需要合并演员和戏服者的名字,因此我们将首先使用UNION。然后,该结果集与参与者8结合在一起以匹配名字。

SELECT s.first_name,s.last_name 
FROM (
  SELECT c.first_name,c.last_name 
  FROM customer c
  UNION ALL
  SELECT a.first_name,a.last_name 
  FROM actor a
  WHERE a.actor_id != 8
) as s
  JOIN actor a8 ON a8.first_name = s.first_name
WHERE a8.actor_id=8

答案 1 :(得分:0)

您需要获得演员以及客户名称。两者都在两个不同的表中。因此一种方法可以是使用UNION ALL

(SELECT customer_id AS id, 
        first_name, 
        last_name
 FROM customer
 WHERE first_name = (SELECT first_name FROM actor WHERE actor_id = 8))

UNION ALL

(SELECT actor_id AS id, 
        first_name, 
        last_name
 FROM actor
 WHERE actor_id <> 8 AND 
       first_name = (SELECT first_name FROM actor WHERE actor_id = 8))

答案 2 :(得分:-1)

我会说

Select C.firstName, C.lastName 
from Customer C, actor A 
where C.firstName=A.firstName and C.lastName=A.lastName and A.id=8

这意味着,您正在数据库中搜索“客户”表中的所有记录,其中名字和姓氏与表Actor的ID为8的记录中的名字和姓氏完全相同。之所以使用“和”,是因为您希望所有条件都同时为真。您不需要从演员那里提取任何东西,因为您不需要它:它是内部执行的“选择”;无论如何,您还应该从客户那里提取其他重要数据,否则只会得到一堆所有相同的行。

查询n°2:

Select A.fistName, A.lastName 
from actor A 
where A.firstName=(
  select firstName 
  from actor where id=8
) and A.lastName=(
  select lastName 
  from actor where id=8
) and id<>8

您必须使用子查询,即()之间的“选择”;那是因为如果您在表actor中搜索id = 8,则只会得到一行,即id = 8的那一行。通过子查询,数据库首先获取要用于比较的数据,然后才搜索其他行。