Dotaz prvni AAA.
Potrebujes, aby tam byli vsichni uzivatele nebo jen ti, co maji aspon jeden stav nenulovy?
SELECT id_user FROM users
SELECT id_user FROM articles WHERE id_state IN (1,2,3,4)
Pokud te ovsem zajimaji jen uzivatele s nejakym statusem a aplikaci doplnis nuly vsude jinde, tak ti staci z druheho dotazu smazat cast s id_user IN.
Druhy dotaz BBB je
SELECT id_state, id_user,COUNT(*) AS pocet FROM articles WHERE id_state IN (1,2,3,4) AND id_user IN (AAA) GROUP BY id_user, id_state
Jestli spravne chapu, tak ta suma te v celku nezajima a kdyby jo, da se to snadno pridat nebo poscitat pak php aplikaci.
Nevim, zda to pujde takhle napsat, jestli se to nemusi napsat trochu jinak s tim id_user IN (AAA).
A tretim dotazem CCC to das jen dohromady a pridas informace k jednotlivym sloupcum. Nema smysl tam pripojovat dalsi tabulky pro kazdy radek, kdyz to jeste nemas zgrupovane.
SELECT x.id_state, x.id_user, x.pocet, a.user_name, b.state_name
FROM (BBB) x -- musi se tam dat alias k tabulce
LEFT JOIN users a ...
LEFT JOIN states b ...
ORDER BY id_state, id_user
No, a pri tom uplne zjednodusovani by to slo napsat jako
SELECT id_state, id_user,COUNT(*) AS pocet FROM articles GROUP BY id_user, id_state -- + ty left join a order
To ti vypise vsechny, kde je ulozeny nejaky status, zgrupuje podle uzivatele a statusu. seradi podle statusu a uzivatele. Jediny problem je, ze muze nastat situace, kdy nemas na zacatku vsechny uzivatele kteri maji aspon jeden status a pak by aplikacka musela nejdriv projet cyklem cely vysledek a sesbirat id uzivatelu a seradit je. Ale to by se dalo resit UNIONem na zacatku a v aplikacce radek vynechat.
SELECT id_user,id_state,-1 AS pocet FROM states GROUP BY id_user -- nastavim na -1, a opet + left join
UNION
CCC