问题:
您将获得三个表:学生,朋友和礼包。
学生包含两列:ID和名称。
写一个查询,输出那些最好的朋友获得比他们更高薪水的学生的名字。姓名必须按照提供给最好朋友的工资金额来订购。保证没有两个学生得到相同的报酬。
代码:
这是我提出的代码,但它没有产生正确的结果。谁能让我知道为什么?
select TableA.name
from
(select s.id,s.name,p.salary from students s inner join packages p on s.id=p.id) TableA,
(select f.id,f.friend_id, p2.salary from friends f inner join packages p2 on f.friend_id=p2.id) TableB
where TableA.id=TableB.id And TableA.salary>TableB.salary
order by TableB.salary desc;
答案 0 :(得分:1)
我认为您在查询中写了AND TableA.salary < TableB.salary
而不是AND TableA.salary > TableB.salary
。
此外,我认为您的查询可以用更合成的方式编写。
在MSSQL上(但它也适用于MYSQL,因为查询非常基本),你可以尝试使用这个:
SELECT s.id
,s.NAME
,p.salary
, f.friend_id, p2.salary as friend_salary
FROM students s
INNER JOIN packages p ON s.id = p.id
LEFT JOIN friends f ON f.id = s.id
LEFT JOIN packages p2 ON f.friend_id = p2.id
WHERE p.salary <= p2.salary
ORDER BY s.id;
输出:
id NAME salary friend_id friend_salary
1 John 1000 2 1200
3 Pete 800 1 1000
示例数据:
CREATE TABLE students (id int, NAME VARCHAR(30));
CREATE TABLE packages (id int, salary INT);
CREATE TABLE friends (id int, friend_id INT);
INSERT INTO students values (1,'John');
INSERT INTO students values (2,'Arthur');
INSERT INTO students values (3,'Pete');
INSERT INTO packages values (1,1000);
INSERT INTO packages values (2,1200);
INSERT INTO packages values (3,800);
INSERT INTO friends values (1,2);
INSERT INTO friends values (2,3);
INSERT INTO friends values (3,1);
答案 1 :(得分:0)
您已经写了“ where TableA.salary> TableB.salary”,这意味着您要查找薪水大于朋友的行。但是提出的问题是相反的(查找名字是被薪人的薪水比您的薪水高的名字),因此您可以将其更改为“ where TableB.salary> TableA.salary”,这样应该可以。
select my_name from
(select s.id as my_id,s.name my_name,p.salary as my_salary from students s
inner join packages p on s.id=p.id) as my_tbl inner join (select f.id as
id,f.friend_id as frnd_id,p.salary as frnd_salary from friends f inner join
packages p on f.friend_id=p.id ) as frnd_tbl on my_id=id where
frnd_salary>my_salary order by frnd_salary;
答案 2 :(得分:0)
我使用 CTE 来提高代码可读性。我不确定它是否完全优化。但是,它产生了问题的预期结果。
with std_salary as (
SELECT s.id, s.name, p.salary
FROM Students s
JOIN Packages p
ON s.id=p.id),
friend_salary as (
SELECT f.id, p.salary
FROM Friends f
JOIN Packages p
ON f.friend_id=p.id
)
SELECT name
FROM
(SELECT std_salary.name, std_salary.salary as own, friend_salary.salary as friend
FROM std_salary
JOIN friend_salary
ON std_salary.id=friend_salary.id) as final
WHERE final.own<final.friend
ORDER BY final.friend;
答案 3 :(得分:0)
这在 MySql 中对我有用 -
select name from Students
inner join Friends on Friends.ID = Students.ID
inner join Packages P1 on P1.ID = Students.ID
inner join Packages P2 on P2.ID = Friends.Friend_ID
where P2.salary > P1.salary
order by P2.salary;