SQL放置与学生,朋友,包加入

时间:2017-08-21 12:03:27

标签: mysql sql-server join

问题:

  • 您将获得三个表:学生,朋友和礼包。

  • 学生包含两列:ID和名称。

  • 好友包含两列:ID和Friend_ID(唯一最好的朋友的ID)。
  • 包中包含两列:ID和Salary(提供的工资为每月$ 000)。

写一个查询,输出那些最好的朋友获得比他们更高薪水的学生的名字。姓名必须按照提供给最好朋友的工资金额来订购。保证没有两个学生得到相同的报酬。

代码:

这是我提出的代码,但它没有产生正确的结果。谁能让我知道为什么?

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;

4 个答案:

答案 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;