我正在努力解决这个"问题"但是仍然没有成功。我想要实现的是,创建一个将选择特定actor的所有朋友的查询。让我们说我想得到Jason Statham的朋友的名字,姓氏和年龄列表。
下面是表格的图像。 PS:这些表格是否正确组织? (特别是那些外键) 提前致谢
答案 0 :(得分:1)
这会做你想要的吗?
SELECT actors.first_name,
actors.last_name
FROM actors
WHERE actors.login IN
(
SELECT friendslist.loginf
FROM friendslist
WHERE friendslist.logina = 'xstad'
)
答案 1 :(得分:0)
你需要两次包括Actors表 - 一次是焦点人物(Jason Statham),一次是他的朋友。
SELECT CONCAT(A.first_name," ",A.last_name) AS Actor, CONCAT(B.first_name," ",B.last_name) AS Friend
FROM Actors AS A
JOIN [Friends List] AS F on A.login=F.loginA
JOIN Actors AS B on F.loginB=B.login
ORDER BY A.last_name, B.last_name
答案 2 :(得分:0)
如果Friends_List是“[loginA]和[loginF]是朋友”的行,则行应成对出现,< A1,A2>和< A2,A1取代。我认为这意味着“[loginA]认为[loginF]是朋友”,并且在你的查询中“演员的所有朋友”意味着“演员认为是朋友的所有演员”。
您可以使用自然连接执行此操作。它连接在公共列上,只返回一个具有该名称的列。如果您希望两个不同名称的列相互连接,则必须重命名一个。不幸的是,在SQL中你不能只提到一列,你必须全部提到它们。
// first_name, last_name of rows satisfying [login] has name [first_name] [last_name] AND 'xstad' considers [login] a friend
SELECT first_name,last_name
FROM Actors
NATURAL JOIN
(SELECT loginA, loginF AS login
FROM
(SELECT * FROM Friends_List WHERE loginA='xstad')
)
(您可以折叠嵌套的选择,但我正在说明结构。)
您也可以使用NATURAL JOIN而不重命名,但明确表示等于列:
// <firstname,last_name> of rows satisfying [login] has name [first_name] [last_name] AND [login] considers [login] a friend AND loginA='xstad' AND login=loginF
SELECT first_name,last_name
FROM Actors
NATURAL JOIN Friends_List
WHERE loginA='xstad' AND login=loginF
修改
某种设计&amp;大多数SQL程序员不熟悉或不理解的编程风格由自然连接支持。这种方法允许关系代数运算符并行逻辑运算符:结果行满足语句,该语句是参数行满足的语句的AND; UNION OR;除了AND NOT; PROJECT除了一些列{C,...}以外的所有项目,包括EX,C,...;这比处理SQL INNER JOIN中的虚线重复列更简单。不幸的是,SQL没有提供所有相关支持(例如重命名列,项目输出列,没有SQL伪3VL,优化)。
编辑更正了第一个查询