Listázzuk ki az üres napokat

Listázzuk ki az üres napokat
2021-04-19T14:12:04+02:00
2021-04-22T07:10:52+02:00
2022-07-19T00:40:32+02:00
dagobert
Üdv!

Egyszerű feladattal nem boldogulok. Láttam sok kódot a Neten, de nem tudtam megoldani.
Mysql adatbázisban van egy matek táblám, benne egy "mego" (varchar) oszlop melyben 'jó' vagy 'rossz' értékek vannak. Ugyanebben a táblában van még "ido" (datetime) oszlop melyben a megoldás ideje van tárolva /2020-09-01 06:59:21/ formában. Van még id int(5) azonosító.

El kellene tenni egy változóba adott id azonosítójú felhasználó elmúlt 7 napi megoldásainak a számát.
A jó megoldások számát akarom ábrázolni diagramban. Ha nem dolgozott nincs adat a kimaradt napokon.  Nincs az adatbázisban. Nincs mit ábrázolni, ez is nulla lenne. 
Nem tudom kiíratni az üres napokon a nullát.

Amikor van jó vagy rossz megoldás az bekerül az adatbázisba. Amikor nincs munkavégzés akkor nincs adat arról a napról. A diagramban itt nullát kéne ábrázolnom.

Próbálkoztam, de nem sikerült.

SELECT
SUM(CASE WHEN mego='Jó' THEN 1 ELSE 0 END) AS jo
FROM matek
where'$id' = id
group by DATE(ido) ORDER BY ido desc Limit 7

Itt is találtam hasonlót: Return even empty groups when grouping by date

Itt is látható ha nincs adat akkor null -t ír ki.
Mutasd a teljes hozzászólást!
Az előbbi kihagyott néhány napot. Egy picit kell módosítani így.
SELECT  
    qt.nap,  
    SUM(CASE WHEN mego='Jó' THEN 1 ELSE 0 END) AS jo  
FROM ( 
 SELECT Date(DATE_SUB(curdate(), INTERVAL 0 day)) AS nap UNION 
 SELECT Date(DATE_SUB(curdate(), INTERVAL 1 day)) AS nap UNION 
    SELECT Date(DATE_SUB(curdate(), INTERVAL 2 day)) AS nap UNION   
    SELECT Date(DATE_SUB(curdate(), INTERVAL 3 day)) AS nap UNION   
 SELECT Date(DATE_SUB(curdate(), INTERVAL 4 day)) AS nap UNION   
    SELECT Date(DATE_SUB(curdate(), INTERVAL 5 day)) AS nap UNION   
    SELECT Date(DATE_SUB(curdate(), INTERVAL 6 day)) AS nap UNION   
    SELECT Date(DATE_SUB(curdate(), INTERVAL 7 day)) AS nap
) AS qt  
LEFT JOIN  
    matek m  
    ON qt.nap=DATE(m.ido)  
and 
    ((id='$id') OR (id IS NULL))  
GROUP BY  
    DATE(qt.nap)  
ORDER BY  
    qt.nap ASC
Mutasd a teljes hozzászólást!

  • A StackOverflow-ról követve a javaslatot:

    SELECT SUM(CASE WHEN id=1 AND mego='Jó' THEN 1 ELSE 0 END) AS jo, DATE(ido) FROM teszt3 group by DATE(ido), ido ORDER BY ido desc LIMIT 7


    DE! Ehhez az kell, hogy legyen adatod más ID-val a hiányzó napra. Vagyis valami ilyen adatsorral kell rendelkezned:

    create table if not exists teszt3 ( id INT, mego VARCHAR(5), ido DATETIME ); INSERT INTO teszt3 VALUES (1, (CASE WHEN floor(rand() * 10) % 2 THEN 'Jó' ELSE 'Rossz' END), '2021-01-01'), (1, (CASE WHEN floor(rand() * 10) % 2 THEN 'Jó' ELSE 'Rossz' END), '2021-01-02'), (1, (CASE WHEN floor(rand() * 10) % 2 THEN 'Jó' ELSE 'Rossz' END), '2021-01-03'), (2, (CASE WHEN floor(rand() * 10) % 2 THEN 'Jó' ELSE 'Rossz' END), '2021-01-04'), (1, (CASE WHEN floor(rand() * 10) % 2 THEN 'Jó' ELSE 'Rossz' END), '2021-01-05'), (1, (CASE WHEN floor(rand() * 10) % 2 THEN 'Jó' ELSE 'Rossz' END), '2021-01-06'), (1, (CASE WHEN floor(rand() * 10) % 2 THEN 'Jó' ELSE 'Rossz' END), '2021-01-07'), (1, (CASE WHEN floor(rand() * 10) % 2 THEN 'Jó' ELSE 'Rossz' END), '2021-01-08'), (1, (CASE WHEN floor(rand() * 10) % 2 THEN 'Jó' ELSE 'Rossz' END), '2021-01-09');


    Ha nincs adatod minden egyes napra a táblára (akár nem releváns ID-val), akkor szükséged lesz a szintén említett calendar table-re, vagy egy tárolt függvényre, ami elő tud neked állítani egy tetszőleges date range-et.
    Mutasd a teljes hozzászólást!
  • Máshol is kérdeztem. Ez lett számomra a jó megoldás.

    • SELECT  
    •     qt.nap,  
    •     SUM(CASE WHEN mego='Jó' THEN 1 ELSE 0 END) AS jo  
    • FROM (  
    •     SELECT DATE_SUB(curdate(), INTERVAL 1 day) AS nap UNION   
    •     SELECT DATE_SUB(curdate(), INTERVAL 2 day) AS nap UNION   
    •     SELECT DATE_SUB(curdate(), INTERVAL 3 day) AS nap UNION   
    •     SELECT DATE_SUB(curdate(), INTERVAL 4 day) AS nap UNION   
    •     SELECT DATE_SUB(curdate(), INTERVAL 5 day) AS nap UNION   
    •     SELECT DATE_SUB(curdate(), INTERVAL 6 day) AS nap UNION   
    •     SELECT DATE_SUB(curdate(), INTERVAL 7 day) AS nap  
    • ) AS qt  
    • LEFT JOIN  
    •     matek m  
    •     ON qt.nap=DATE(m.ido)  
    • WHERE  
    •     (id=26 OR id IS NULL)  
    • GROUP BY  
    •     DATE(qt.nap)  
    • ORDER BY  
    •     qt.nap ASC  
    • ;
    Köszönöm mindenkinek a munkáját
    Mutasd a teljes hozzászólást!
  • Az előbbi kihagyott néhány napot. Egy picit kell módosítani így.
    SELECT  
        qt.nap,  
        SUM(CASE WHEN mego='Jó' THEN 1 ELSE 0 END) AS jo  
    FROM ( 
     SELECT Date(DATE_SUB(curdate(), INTERVAL 0 day)) AS nap UNION 
     SELECT Date(DATE_SUB(curdate(), INTERVAL 1 day)) AS nap UNION 
        SELECT Date(DATE_SUB(curdate(), INTERVAL 2 day)) AS nap UNION   
        SELECT Date(DATE_SUB(curdate(), INTERVAL 3 day)) AS nap UNION   
     SELECT Date(DATE_SUB(curdate(), INTERVAL 4 day)) AS nap UNION   
        SELECT Date(DATE_SUB(curdate(), INTERVAL 5 day)) AS nap UNION   
        SELECT Date(DATE_SUB(curdate(), INTERVAL 6 day)) AS nap UNION   
        SELECT Date(DATE_SUB(curdate(), INTERVAL 7 day)) AS nap
    ) AS qt  
    LEFT JOIN  
        matek m  
        ON qt.nap=DATE(m.ido)  
    and 
        ((id='$id') OR (id IS NULL))  
    GROUP BY  
        DATE(qt.nap)  
    ORDER BY  
        qt.nap ASC
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd