sql >> Databasteknik >  >> RDS >> Mysql

Hur fyller man datumluckor i MySQL?

Du måste skapa en hjälptabell och fylla den med alla datum från start för att end , sedan bara LEFT JOIN med den tabellen:

SELECT  d.dt AS date,
        COUNT(*) AS total,
        SUM(attitude = 'positive') AS positive,
        SUM(attitude = 'neutral') AS neutral,
        SUM(attitude = 'negative') AS negative
FROM    dates d
LEFT JOIN
        messages m
ON      m.posted_at >= d.dt
        AND m.posted_at < d.dt + INTERVAL 1 DAYS
        AND spam = 0
        AND duplicate = 0
        AND ignore = 0
GROUP BY
        d.dt
ORDER BY
        d.dt

I grund och botten, vad du behöver här är en dummy rowsource.

MySQL är det enda större systemet som saknar ett sätt att generera det.

PostgreSQL implementerar en speciell funktion generate_series för att göra det, medan Oracle och SQL Server kan använda rekursion (CONNECT BY och rekursiv CTE s, följaktligen).



  1. mysql, transponera/pivotera rad till kolumn, variabelval

  2. MySQL - Unik främmande nyckel

  3. ORA-12514-fel efter omstart av servern

  4. Till försvaret av sar (och hur man konfigurerar det)