请帮忙解决以下问题
我有一张 table :人
Id Leader Name1 Name2 StartDate EndDate
123 1 Person1 2013-02-11 2013-02-17
123 0 Person2 2013-02-13 2013-02-13
123 0 Person3 2013-02-13 2013-02-13
我有一个问题1
(SELECT t1.Id, t1.Name1, t1.Name2
FROM `dbo`.`people` t1
WHERE t1.StartDate >= '2013-02-11'
AND t1.Leader = 1)
UNION
(SELECT t2.Id, t2.Name1, t1.Name2
FROM `dbo`.`people` t2
WHERE t2.StartDate >= '2013-02-11'
AND t2.Leader = 0)
返回
Id Name1 Name2
123, Person1
我有一个问题2
(SELECT t1.Id, t1.Name1, t1.Name2
FROM `dbo`.`people` t1
WHERE t1.StartDate >= '2013-02-13'
AND t1.Leader = 1)
UNION
(SELECT t2.Id, t2.Name1, t1.Name2
FROM `dbo`.`people` t2
WHERE t2.StartDate >= '2013-02-13'
AND t2.Leader = 0)
返回
Id Name1 Name2
123, Person1
123, Person2
123, Person3
我需要显示 2012-02-11 的结果
Id Name1 Name2
123, Person1 null
并为 2012-02-13 展示
Id Name1 Name2
123, Person1 Person2
123, Person1 Person3
最佳答案
这是一个满足您期望结果的查询
(SELECT
id,
name1,
IFNULL(name2, 'No one available') AS name2,
startdate AS `date`
FROM
person
WHERE startdate = '2013-02-11')
UNION
ALL
(SELECT
p.id,
IFNULL(p.name1, pl.name1) AS name1,
IFNULL(p.name2, 'Noone available') AS name2,
p.startdate AS `DATE`
FROM
person AS p
LEFT JOIN person AS pl
ON pl.leader = p.id
WHERE p.startdate = '2013-02-13')
输出
id name1 name2 date
---------------------------------------------------
1 Person1 No one available 2013-02-11
1 Person1 Person2 2013-02-13
1 Person1 Person3 2013-02-13
点击Here用于演示
这是您稍作修改的查询
(SELECT
t1.Id,
t1.Name1,
IFNULL(t1.Name2, 'Null') AS Name2
FROM
`dbo`.`people` t1
WHERE t1.StartDate >= '2013-02-13'
AND t1.Leader = 1)
UNION
(SELECT
t2.Id,
IFNULL(t2.Name1, p.leader) AS Name1,
t1.Name2
FROM
`dbo`.`people` t2
LEFT JOIN people AS p
ON p.leader = t2.id
WHERE t2.StartDate >= '2013-02-13'
AND t2.Leader = 0)
编辑
另一种选择是使用子查询
(SELECT
t1.Id,
t1.Name1,
IFNULL(t1.Name2, 'Null') AS Name2
FROM
`dbo`.`people` t1
WHERE t1.StartDate >= '2013-02-13'
AND t1.Leader = 1)
UNION
(SELECT
t2.Id,
IFNULL(t2.Name1, (SELECT name1 FROM people WHERE t2.StartDate = '2013-02-13')) AS Name1,
t2.Name2
FROM
`dbo`.`people` t2
WHERE t2.StartDate >= '2013-02-13'
AND t2.Leader = 0)
在 union 的第二部分 name1 中出现 selection ifnull 时,删除 join 并使用子查询。 此查询从表 IFNULL 中获取结果,检查 Name1 字段是否为空。如果这是空的,执行 IFNULL 的第二个参数,它是一个子查询,将获取一个名称。如果您需要更多帮助,请在谷歌上做一些研究。
关于mysql - Sql Join 查询的行结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14786455/