2013-02-09 60 views
1

请通过以下问题mSQL的连接的查询

帮助排结果我有一个表:人

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 

我有一个QUERY1

(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 
+0

您是否尝试过'CROSS JOIN'而不是'UNION'? – luckystars 2013-02-09 09:06:16

+0

关于你想要的结果的开始和结束日期? – 2013-02-09 09:06:28

+0

嗨Raheen,几乎有但Id和Leader不相关,因此不能使用ON pl.leader = p.id. Id是一个计数器,可以是任何值,Leader是一个指标,只能是0或1。谢谢 – user1254513 2013-02-09 09:39:47

回答

1

这是一个满足您所需结果的查询

(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) 

EDITS

另一种方法为t Ø使用子查询

(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) 

删除连接和而选择IFNULL进来名1在联盟的第二部分使用子查询。 如果Name1字段为空或非空,此查询将从表IFNull检查中提取结果。如果这是空的,则执行作为子查询的IFNULL的第二个参数并获取名称。如果您需要更多帮助,请对Google进行一些调查。

+0

嗨Raheen,几乎有但Id和Leader不相关,因此不能使用ON pl.leader = p.id. Id是一个计数器,可以是任何值,Leader是一个指标,只能是0或1。谢谢 – user1254513 2013-02-09 09:54:32

+0

嗨拉欣,我是新手对不起,你能举个例子来帮助我。 – user1254513 2013-02-09 10:30:40

+0

@ user1254513请查看更新,并尝试对Google或Stackoverflow进行一些调查。对不起我很忙。 – 2013-02-09 10:36:03