2016-10-14 15 views
1

、GROUP BYで列にNULLでない値を持つレジスタを選択します。私はnullではないid_taskでレジスタを取得しようとしている私は次のクエリで次の結果持って

enter image description here

SELECT `id_booking`, `id_task`, `type`, `date` 
FROM (SELECT `id` AS `id_booking`, null AS `id_task`, 1 AS `type`, `date_in` AS `date` 
    FROM `booking` 
    WHERE `date_in` <= '2016-10-24' 
    AND `date_in` >= '2016-10-14' 
    AND `status` = 'accepted' 
    UNION ALL 
    SELECT `id` AS `id_booking`, null AS `id_task`, 2 AS `type`, `date_out` AS `date` 
    FROM `booking` 
    WHERE `date_out` <= '2016-10-24' 
    AND `date_out` >= '2016-10-14' 
    AND `status` = 'accepted' 
    UNION ALL 
    SELECT `booking_id` AS `id_booking`, `id` AS `id_task`, `id_type` AS `type`, `date` AS `date` 
    FROM `task` 
    WHERE `date` <= '2016-10-24' 
    AND `date` >= '2016-10-14') 
    AS `tasks` 
ORDER BY `date` ASC 

id_bookingtypeが重複していますが、私がGROUP BY節を導入した場合は、id_task = NULLの最初の1つのレジスタを取得できます。

GROUP BYでグループ化された複数のレジスタ間でnull以外の値を持つレジスタを取る可能性はありますか?

答えて

0

少し複雑...

いますが、唯一のid聖霊降臨祭は、行を複製してこれらのみではないとヌルタイプ

SELECT `id_booking`, `id_task`, `type`, `date` 
    FROM (SELECT `id` AS `id_booking`, null AS `id_task`, 1 AS `type`, `date_in` AS `date` 
     FROM `booking` 
     WHERE `date_in` <= '2016-10-24' 
     AND `date_in` >= '2016-10-14' 
     AND `status` = 'accepted' 
     UNION ALL 
     SELECT `id` AS `id_booking`, null AS `id_task`, 2 AS `type`, `date_out` AS `date` 
     FROM `booking` 
     WHERE `date_out` <= '2016-10-24' 
     AND `date_out` >= '2016-10-14' 
     AND `status` = 'accepted' 
     UNION ALL 
     SELECT `booking_id` AS `id_booking`, `id` AS `id_task`, `id_type` AS `type`, `date` AS `date` 
     FROM `task` 
     WHERE `date` <= '2016-10-24' 
     AND `date` >= '2016-10-14') AS `tasks` 
    where (`id_booking`, `type`) in ( select `id_booking`, `type` FROM 
      (SELECT `id` AS `id_booking`, null AS `id_task`, 1 AS `type`, `date_in` AS `date` 
       FROM `booking` 
       WHERE `date_in` <= '2016-10-24' 
       AND `date_in` >= '2016-10-14' 
       AND `status` = 'accepted' 
       UNION ALL 
       SELECT `id` AS `id_booking`, null AS `id_task`, 2 AS `type`, `date_out` AS `date` 
       FROM `booking` 
       WHERE `date_out` <= '2016-10-24' 
       AND `date_out` >= '2016-10-14' 
       AND `status` = 'accepted' 
       UNION ALL 
       SELECT `booking_id` AS `id_booking`, `id` AS `id_task`, `id_type` AS `type`, `date` AS `date` 
       FROM `task` 
       WHERE `date` <= '2016-10-24' 
       AND `date` >= '2016-10-14') t 
       group by `id_booking`, `type` 
       having count(*) > 1   
    ) 
    and id_task is not null 

union 

SELECT `id_booking`, `id_task`, `type`, `date` 
    FROM (SELECT `id` AS `id_booking`, null AS `id_task`, 1 AS `type`, `date_in` AS `date` 
     FROM `booking` 
     WHERE `date_in` <= '2016-10-24' 
     AND `date_in` >= '2016-10-14' 
     AND `status` = 'accepted' 
     UNION ALL 
     SELECT `id` AS `id_booking`, null AS `id_task`, 2 AS `type`, `date_out` AS `date` 
     FROM `booking` 
     WHERE `date_out` <= '2016-10-24' 
     AND `date_out` >= '2016-10-14' 
     AND `status` = 'accepted' 
     UNION ALL 
     SELECT `booking_id` AS `id_booking`, `id` AS `id_task`, `id_type` AS `type`, `date` AS `date` 
     FROM `task` 
     WHERE `date` <= '2016-10-24' 
     AND `date` >= '2016-10-14') AS `tasks` 
    where (`id_booking`, `type`) in ( select `id_booking`, `type` FROM 
      (SELECT `id` AS `id_booking`, null AS `id_task`, 1 AS `type`, `date_in` AS `date` 
       FROM `booking` 
       WHERE `date_in` <= '2016-10-24' 
       AND `date_in` >= '2016-10-14' 
       AND `status` = 'accepted' 
       UNION ALL 
       SELECT `id` AS `id_booking`, null AS `id_task`, 2 AS `type`, `date_out` AS `date` 
       FROM `booking` 
       WHERE `date_out` <= '2016-10-24' 
       AND `date_out` >= '2016-10-14' 
       AND `status` = 'accepted' 
       UNION ALL 
       SELECT `booking_id` AS `id_booking`, `id` AS `id_task`, `id_type` AS `type`, `date` AS `date` 
       FROM `task` 
       WHERE `date` <= '2016-10-24' 
       AND `date` >= '2016-10-14') t 
       group by `id_booking`, `type` 
       having count(*) = 1   
    ) 
    and id_task is null 

ORDER BY `date` ASC 
+0

こんにちは、このために選択する必要があります選択組合の結果から!大変申し訳ありませんが、私はその返事を理解していません。私が投稿した結果は、2つの異なるテーブルから来て、そのうちの1つに2つの異なる日付カラムがあります。私はUNIONをやっているので、それが理由です。このテーブル構造でソリューションを適用するにはどうすればよいですか? –

+0

@DavidLombardía申し訳ありません私はあなたのコードを簡単に見ています..とにかく私はあなたに完全なクエリを参照して答えを更新しました – scaisEdge

+0

ありがとう!しかし、私はまだ問題があります:最初の1つは、 "すべての派生テーブルは、独自のエイリアスを持っている必要があります"と私はこのSQLでnullではないid_taskとレジスタを持つことができますが、私は同じid_bookingと型の複数のレジスタがある場合に備えて、id_taskがnullでない場合にのみ登録します。ありがとう! –

関連する問題