MySQL PŘIPOJIL tabulku, dotaz by měl vrátit nula, ale místo toho se nevrací řádky

0

Otázka

SELECT sg.date, sg.groupName, sg.highlights, 
        user.display_name as displayName,
        COUNT(uc.groupName) as cmtcnt
FROM `saved_groups` as sg
    LEFT JOIN `user` on user.email = sg.userName
    LEFT JOIN `user_comments` as uc on sg.groupName = uc.groupName
WHERE uc.deleted=0
GROUP BY sg.groupName

Mám dvě tabulky, saved_groups a user_comments a druhý řádek dotazu by měl (ano, to funguje), návrat navíc sloupec s počtem komentářů, spojené s každé skupiny.

Nicméně, když skupina nemá žádné připomínky související s tím, že skupina je prostě nevrátil. Pouze řádky, které jsou vráceny jsou ty, které mají > 0 komentáře. Požadované chování je pro všechny groupNames mají být vráceny, a zadejte 0 pro ty řádky, které nemají žádné související komentáře v uc stolu.

Jak to mohu opravit tento dotaz?

Zkoušel jsem: IF(uc.deleted=1, 0, COUNT(uc.groupName)) as cmtcnt - ale to dělá žádný rozdíl, stejné výsledky jsou vráceny.

V tomto bodě, nejsem si jistá, co dalšího zkusit.

Návrhy?

Aktualizace:

Zkusil toto:

SELECT sg.date, sg.groupName, sg.highlights, 
        user.display_name as displayName,
        COUNT(uc.groupName) as cmtcnt
FROM geom.saved_groups as sg
    JOIN geom.user on user.email = sg.userName
    JOIN geom.user_comments as uc on sg.groupName = uc.groupName
WHERE isnull(uc.deleted,0) in (0,1)
GROUP BY sg.groupName

Mám: #1582 - Incorrect parameter count in the call to native function 'isnull'

mariadb mysql sql
2021-11-22 16:27:44
3

Nejlepší odpověď

1

Chcete, aby všechny záznamy? Pak vyjměte WHERE doložka. Chcete 0 pro záznamy s ne počítat? Použití COALESCE. Takhle:

SELECT sg.date
, sg.groupName
, sg.highlights
, user.display_name as displayName
, COALESCE(COUNT(uc.groupName), 0) as cmtcnt 
FROM `saved_groups` as sg 
LEFT JOIN `user` on user.email = sg.userName 
LEFT JOIN `user_comments` as uc on sg.groupName = uc.groupName 
AND uc.deleted = 0 -- to get only comments that have not been deleted, and not the deleted ones
GROUP BY sg.groupName
2021-11-22 19:09:24

Ha! Že to fungovalo. Vlastně jsem se snažil COALESCE ale udělal to v kombinaci s klauzule where, a nemyslela jsem si, že to bylo ještě stojí za zmínku, protože to vypadalo, že se žádný rozdíl (vzhledem ke klauzuli where, teď už vím). Dal jsi mi chybějící informace. Díky moc.
cssyphus

COUNT(uc.groupName) nikdy vrátí null, takže SPLÝVAJÍ() je k ničemu. To, co dělá rozdíl v klauzule ON.
forpas

@forpas jsem si nebyl moc jistý mysql a splývají (mysql má/měl neočekávané chování někdy (alespoň pro mě)), tak přidá, aby to bylo jistý.
HoneyBadger

@HoneyBadger Omlouvám se, musel jsem implementoval nesprávně - to zkusil znovu aktualizovat můj názor a to fungovalo jak inzeroval. Díky moc za aktualizaci odpověď na pokrytí A stav - funguje skvěle.
cssyphus
0

Kde podmínka je filtrování záznamů a dělat pouze ty záznamy, které mají data v uc tedy žádný prospěch z left join. Můžete to udělat (uc.deleted=0 or uc.deleted is null) nebo Přesunout podmínka uc.zrušuje se na stavu se připojit

2021-11-22 16:38:54

Nechápu, jak realizovat váš návrh, jak přesně bych měl nastavit můj dotaz? (Příklad kódu, pls) pokoušel jsem se, aby tento test, ale nemohou se dostat syntaxe správná.
cssyphus
-1

zkontrolujte, zda uc.deleted=0 a odstranit, kde podmínkou. a zpracovává non null stav left join

SELECT sg.date, sg.groupName, sg.highlights, 
        user.display_name as displayName,
        COUNT(uc.groupName) as cmtcnt
FROM dbo.saved_groups as sg
    JOIN dbo.user on user.email = sg.userName
    LEFT JOIN dbo.user_comments as uc on sg.groupName = uc.groupName
    AND uc.deleted = 0
GROUP BY sg.groupName
2021-11-22 16:34:19

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................