1

次の問題を解決してください

私はテーブルを持っています:人々

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
4

1 に答える 1

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

デモここをクリック

そして、ここに少し変更を加えたクエリがあります

(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 の 2 番目の部分の name1 に選択 ifnull が含まれている間にサブクエリを使用します。このクエリは、テーブル IFNULL から結果をフェッチし、Name1 フィールドが空かどうかをチェックします。これが空の場合、サブクエリである IFNULL の 2 番目の引数を実行し、名前を取得します。さらにヘルプが必要な場合は、Google で調査してください。

于 2013-02-09T09:21:11.743 に答える