5

私はデータベースを持っています:

+--+----+---------+
|id|name|source_id|
+--+----+---------+
|11|aaaa|null
+--+----+---------+
|12|bbbb|1
+--+----+---------+
|13|cccc|1
+--+----+---------+
|14|dddd|null
+--+----+---------+
|15|eeee|2
+--+----+---------+
|16|ffff|2
+--+----+---------+
|17|gggg|2
+--+----+---------+

例外を除いて、すべてのエントリを選択したいと思います。

  • のすべてのエントリをsource_id == somevalue(not null)グループ化する必要があります
  • の最後のエントリsource_id == nullは後で存在する必要があります

これが私が期待する結果です:

+----+--+----+---------+
COUNT|id|name|source_id|
+----+--+----+---------+
.....|11|aaaa|null
+----+--+----+---------+
.2...|13|cccc|1
+----+--+----+---------+
.....|14|dddd|null
+----+--+----+---------+
.3...|17|ffff|2
+----+--+----+---------+

これまでにこれを実行しました(注: "change_count" = COUNT):

SELECT *, (To_days(date_expires)-TO_DAYS(NOW())) as dayDiff, COUNT(id) AS change_count FROM mytable
GROUP BY source_id 
HAVING dayDiff < 4 
ORDER BY date_created DESC

それが私が得ているものです:

+----+--+----+---------+
COUNT|id|name|source_id|
+----+--+----+---------+
.2...|11|aaaa|null
+----+--+----+---------+
.2...|12|bbbb|1
+----+--+----+---------+
.3...|15|eeee|2
+----+--+----+---------+

ご覧のとおり、結果には2つの問題があります。

  • エントリは最初のsource_id出現順にグループ化されます(最後(最新)である必要があります)
  • nullsまた、グループ化されます(グループ化されるべきではありません)

上記で説明したタスクは実行可能ですか?どうすればいいのですか?

編集:

SELECT *, COUNT(id) AS change_count FROM 
(SELECT *, (To_days(date_return_due)-TO_DAYS(NOW())) as dayDiff FROM mytable 
WHERE owner_id='1' 
HAVING dayDiff < 100 
ORDER BY date_created DESC) AS newtable
GROUP BY (CASE WHEN source_id IS NULL THEN id ELSE source_id END)
ORDER BY (CASE WHEN source_id IS NULL THEN 1 ELSE 0 END), date_created DESC";
4

3 に答える 3

8

私は以下があなたが望むことをするだろうと思います:

SELECT *, (To_days(date_expires)-TO_DAYS(NOW())) as dayDiff, COUNT(id) AS change_count
FROM mytable
GROUP BY (case when source_id is null then id else source_id end)
HAVING dayDiff < 4 
ORDER BY (case when source_id is null then 1 else 0 end), date_created DESC

group byNULLソースIDがグループ化されないように、条件付きで実行されます。次に、ロジックを使用してそれらを最後に配置しorder byます。

私はあなたが最後の出来事が何を意味するのか理解していませんでした。今私はそう思う:

SELECT coalesce(s.id, mytable.id) as id,
       max(case when s.maxid is not null and s.maxid = myable.id then mytable.name
                when s.maxid is null then NULL
                else mytable.name
           end) as name,
       (To_days(date_expires)-TO_DAYS(NOW())) as dayDiff, COUNT(id) AS change_count
FROM mytable left outer join
     (select source_id, MAX(id) as maxid
      from mytable
      where source_id is not null
      group by source_id
     ) s
     on mytable.id = s.maxid
GROUP BY (case when source_id is null then id else source_id end)
HAVING dayDiff < 4 
ORDER BY (case when source_id is null then 1 else 0 end), date_created DESC

これにより、最新のレコードからの情報が結合されます(最高のIDに基づく)。

于 2013-02-20T19:08:49.943 に答える
5

次のように変更してみてくださいgroup by

GROUP BY coalesce(source_id, id)
于 2013-02-20T19:07:42.053 に答える
0

これを試して

SELECT *、IFNULL(source_id、UUID())as unique_source FROM tablename WHERE(条件)GROUP BY unique_source

于 2014-03-25T12:26:21.090 に答える