mysql - Sql Join 查询的行结果

标签 mysql select join

请帮忙解决以下问题

我有一张 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/

相关文章:

sql - 如何查找未加入的记录?

c# - 具有条件连接和非匿名返回的 LINQ 查询

mysql - 我将如何优化这个 WordPress 查询?

php - 动态和依赖形式

c - Select() 使用相同的套接字描述符发送和接收

javascript - 动态创建一个选择,然后更改 ajax 调用以附加 html

mysql - 尝试通过 SQL JOIN 将 "add"一列添加到表中

java - 如何在多线程环境下mysql hibernate使用一张表的自增值插入多张表

mysql - 在 MySQL 中读取 ASP.NET 成员资格表时出错

html - 如何设置选择元素的箭头样式