У меня есть база данных:группа, не-нулевых значений
+--+----+---------+
|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
также сгруппированы (не должны группироваться)
задача, которую я описал выше достижимо? Как мне это сделать?
Edit:
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";
Подсказка: использовать 'UNION'. О, добавьте тег Oracle, если вы используете Oracle. –