我正在尝试创建一个SQL查询,以便从符合特定条件的表中返回列值。
目前,我已经使用CONCAT函数将名字和姓氏连接到查询结果中的单个列中,以用于具有“程序员”角色的员工。
SELECT
person.id, CONCAT(person.firstname,' ', person.lastname) AS FULLNAME
FROM
person, role
WHERE
person.role_id = role.id AND role.name = 'Programmer'
这成功运行并返回表中的所有程序员。请注意,在我的表结构中,我有一个actingas_id
列。这是另一个人的关键。对于那些在下班休假期间代表他人工作的人。
因此,我们到达了我的问题:如何修改SQL查询,以便当一个人行动时,查询将检索此人的名字和姓氏以及该人的姓名。 “鞋子正在被填满”?
我的表格结构如下:
人: id |名字|姓氏| role_id | actingas_id |
角色: id |名字|
+----+-----------+----------+---------+-------------+
| id | firstname | lastname | role_id | actingas_id |
+----+-----------+----------+---------+-------------+
| 1 | John | Smith | 1 | 0 |
| 2 | Kevin | Tull | 2 | 1 |
| 3 | Michael | Woods | 1 | 0 |
+----+-----------+----------+---------+-------------+
凯文在这里代表约翰,迈克尔也是程序员,所以我的查询结果应该是:
+----+-------------------------+
| id | NAME |
+----+-------------------------+
| 1 | John Smith - Kevin Tull |
| 3 | Michael Woods |
| x | Other Programmers.. |
+----+-------------------------+
答案 0 :(得分:0)
此未经测试的查询应该为您提供所需的结果:
SELECT person1.id, CASE WHEN person1.actingas_id =0 then CONCAT(person1.firstname,' ', person1.lastname) else CONCAT(person1.firstname,' ', person1.lastname,' - ', person2.firstname,' ', person2.lastname) AS FULLNAME
FROM person person1 left join person person2 on person1.actingas_id=person2.id
join role on person1.role_id=role.id
WHERE role.name = 'Programmer'
答案 1 :(得分:0)
使用UNION ALL
添加其他记录:
SELECT person.id,
CONCAT(person.firstname,' ', person.lastname) AS FULLNAME
FROM person INNER JOIN role
ON person.role_id = role.id
WHERE role.name = 'Programmer'
AND NOT EXISTS(SELECT 1 FROM person p WHERE p.actingas_id = person.id)
UNION ALL
SELECT a.id,
CONCAT(a.firstname,' ', a.lastname, ' - ', person.firstname,' ', person.lastname) AS FULLNAME
FROM person INNER JOIN person a
ON a.acting_as = person.id
INNER JOIN role
ON person.role_id = role.id
WHERE role.name = 'Programmer' AND a.actingas_id <> 0
另外,避免使用旧式逗号分隔的JOIN。使用INNER JOIN