Pocet zaznamu rozdelenych na uzivatele – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pocet zaznamu rozdelenych na uzivatele – MySQL – Fórum – Programujte.comPocet zaznamu rozdelenych na uzivatele – MySQL – Fórum – Programujte.com

 

Row0
Stálý člen
27. 8. 2015   #1
-
0
-

Dobrý den

Mám tabulky cislo jedna se zaznamy a tabulku cislo dve s uzivateli.

Tabulka cislo jedna obsahuje sloupec ID UZIVATELE.

S tabulky cislo jedna exportuji toto

SELECT state, COUNT( state ) 
FROM `sf_telesales` 
WHERE deleted =0
GROUP BY state
HAVING COUNT( state ) >0

Takze mi to hodi pocet duplicitnich zaznamu. 

Something 263

Something1 2

Something2 89

Something3 45

Ted bych potreboval rozpad techto cisel podle uzivatelu. Takze prijoinovat tabulku uzivatelu podle id v tabulce cislo jedna. a potreboval bych sloupce kde prvni bude "state(Something...)" a v dalsich sloupeckach bude jmeno uzivatele a knim prislusny pocet zaznamu.

Doufam ze jsem to vysvetlil dobre a snad to pujde udelat.

Nahlásit jako SPAM
IP: 46.13.3.–
smiesek0
Newbie
28. 8. 2015   #2
-
0
-

pro mé lepší pochopení můžete sem vložit sloupce osobou tabulek? A pak i nějaký nástin/konkrétní příklad se záznamy, tedy toho, jaké postupně sloupce chcete vypisovat a jakým řazením?

Takhle se mi to bez ukázky špatně logicky chápe, ač bych se ráda pokusila pomoci

Nahlásit jako SPAM
IP: 109.81.209.–
P
~ Anonymní uživatel
212 příspěvků
28. 8. 2015   #3
-
0
-

Zasadni je, jestli chces ke kazdymu uzivateli vypsat celkovy pocet zaznamu za jeho state, nebo jestli chces ty pocty za state jeste dale rozdelit podle uzivatele. To z toho dotazu nejde poznat.

Nahlásit jako SPAM
IP: 85.93.116.–
Row0
Stálý člen
28. 8. 2015   #4
-
0
-

#3 P
Chci zaznamy rozdelit tak ze kazdy uzivatel ve sloupecku bude mit prirazeny danny pocet ze state (Kolik ze z tohoto state ma uzivatel)

jeste jen doplnim ze uzivatele zrejme budou fixni tudiz jejich pocet predem znam.

Nahlásit jako SPAM
IP: 46.13.3.–
ondrej39+1
Věrný člen
28. 8. 2015   #5
-
0
-

#4 Row
Co má tedy být výsledek query? Co je konkrétně state? State jako stát, nebo state jako stav? V tabulce 1 chceš uchovávat data, že uživatel může mít více položek state v proměnném čase a ty chceš spočítat, kolikrát měl určitou položku (třeba, že by ji měl i víckrát než jednou)?

SELECT
	t_t.id,
	t_t.name,
	t_t.surname,
	t_o.state,
	count(t_o.state)
FROM
	table_one AS t_o
JOIN
	table_two AS t_t
ON
	t_o.id_user = t_t.id
GROUP BY
	t_t.id,
	t_o.state;
Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
Kit+15
Guru
28. 8. 2015   #6
-
0
-

#5 ondrej39
t_t, t_o table_one, table_two - to mají být názvy tabulek? Ze které učebnice jsi takovou špínu vyhrabal?

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:7cbe:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ondrej39+1
Věrný člen
28. 8. 2015   #7
-
0
-

#6 Kit
Row psal, že má tabulku jedna (table_one) a tabulku dva (table_two), ne? Co na tom stejně záleží?

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
Kit+15
Guru
28. 8. 2015   #8
-
0
-

#7 ondrej39
Promiň, takové názvy mě děsně dráždí, stejně jako foo a bar. V žádné uznávané učebnici takové zmatečné názvy nenacházím. Jakákoli výuka má být názorná - t_o a t_t jakoukoli názornost zcela postrádají. Je to dobré akorát k tomu, aby se do toho programátor zamotal.

Některým programátorům by asi vyhovoval starý Basic. Tam byly proměnné pojmenované A-Z a A0..Z9.

Rád bych odpověděl na původní dotaz, ale četl jsem ho už několikrát a bohužel stále netuším, vo co go. Asi je to napsáno jazykem jiného kmene.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:7cbe:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ondrej39+1
Věrný člen
28. 8. 2015   #9
-
0
-

#8 Kit
Co je na tom dráždivého? :D V dotazu se ptá na tabulku jedna a tabulku dvě, ve svém query mám tabulku jedna (table one) a tabulku dvě (table two), co se těch AS týče, tak to mám z práce, kde máme slova v názvech_tabulek_oddělené_podtržítky a zkracujeme je buď na první písmena ze slov bez podtržítek (ntop) nebo s nimi (n_t_o_p). Tady jsem si to asi odpustit mohl, to uznávám, když je v praxi těch tabulek přes 600 a máš SQL query na 130 řádků, tak vypisovat to pořád ručně už prostě nejde.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
Kit+15
Guru
29. 8. 2015   #10
-
0
-

#9 ondrej39
To máte v názvech tabulek i víc než dvě slova?

Slovo "table" bych zcela vypustil kvůli nízké hodnotě, zůstalo by mi pouze "one" a "two". Dále vidím, že místo "two" by bylo mnohem výhodnější použít "user". Zbývá "one" - z původního dotazu si vypůjčím slovo "sale". Když to zkusím aplikovat na tvůj příklad, jeví se mi to jako mnohem čitelnější:

SELECT user.id, user.name, user.surname, sale.state, count(sale.state)
    FROM table_one AS sale
    JOIN table_two AS user ON one.user_id = user.id
    GROUP BY user.id, sale.state;

Asi bych za tohle u vás dostal vynadáno, ale mně se to jeví jako podstatně přehlednější a začínám rozumět tomu, co jsi tímto dotazem chtěl sdělit. Tvému zápisu jsem předtím vůbec nerozuměl. Pokud máš hodně takových query na 130 řádek, tak bych to bez přepisu absolutně nezvládl číst.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:7cbe:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ondrej39+1
Věrný člen
29. 8. 2015   #11
-
0
-

#10 Kit
Nuž, máme třeba tabulku, kde těch slov je 6 a celková délka názvu tabulky je přes 50 znaků (a hned vedle ní je třeba tabulka další, která se liší jen v posledním slově). Samozřejmě, kdybys dneska vzal celou tu databázi, tak jak aktuálně existuje, a kompletně ji předělal, je dost možné, že tam tato konkrétní tabulka s názvem obsahujícím šest slov ani nebude, ale tabulka tam prostě je kvůli tomu, jak se postupně projekt zvětšoval, bylo třeba na něho nabalit další a další věci, které klienti potřebovali a na kompletní rekonstrukci prostě není budget, ale hlavně ani čas.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
Kit+15
Guru
29. 8. 2015   #12
-
0
-

#11 ondrej39
Jak to tak čtu, ježí se mi všechny chlupy. Chápu, že u rozjetého projektu se to dá měnit jen těžko a nikdo to nezaplatí. Ale dá se aspoň vytvořit nová konvence aliasů tak, aby jejich názvy měly alespoň nějakou informační hodnotu.

Jak sis možná všiml, obvykle nezkracuji dlouhé názvy zprava, ale zleva, protože na konci sousloví obvykle bývá právě to nejdůležitější slovo. Slova na začátku obvykle vyjadřují jen kontext, který u konkrétního zápisu nebývá zajímavý a proto se v aliasu vůbec nemusí vyskytovat. Viz např. slovo "table", které je v aliasech zcela zbytečné a předpona "t_" pouze zhoršuje čitelnost query.

Obecnou zásadou tvorby názvů proměnných je nepoužívat zkratky - s výjimkou těch běžně používaných. Platí to i pro aliasy a dočasné proměnné.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:7cbe:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ondrej39+1
Věrný člen
29. 8. 2015   #13
-
0
-

#12 Kit
Však konvenci máme, používáme první písmena ze slov v názvech tabulky :D.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
Kit+15
Guru
29. 8. 2015   #14
-
0
-

#13 ondrej39
To považuji za velmi špatnou konvenci odporující dnešním zásadám.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Row0
Stálý člen
30. 8. 2015   #15
-
0
-
Nahlásit jako SPAM
IP: 194.228.20.–
ondrej39+1
Věrný člen
30. 8. 2015   #16
-
+1
-
Zajímavé
Row +

#15 Row
Tohke SQL dotazem neudeláš, nemůžeš cpát obsah jedné tabulky jako názvy sloupců. Mohl bys to tam vypsat ručně, ale při 100 000 uživatelích by ses z toho zbláznil.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
Kit+15
Guru
31. 8. 2015   #17
-
+1
-
Zajímavé
Row +

#15 Row
Říká se tomu pivotní tabulka (angl. pivot table). Některé SQL databáze to přímo podporují (PostgreSQL), v jiných to dá docela dost práce.

Google ti vyhledá řešení.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Row0
Stálý člen
31. 8. 2015   #18
-
0
-

Pokud nikdo tvrdi ze to nejde neumi se podle me dostatecne zamyslet nebo jsem asi problem nepodal tak jak bych mel.

Mohu udelat jednu "prassarnu" Pokud predem vim pocet uzivatelu tak preci subquery mohu doparovat vzdy daneho uzivatele.

Takze pokud tvrdite ze to nejde je to nesmysl spis ale hledam zpusob jak to udelat jednoduseji a efektivneji.

Nahlásit jako SPAM
IP: 46.13.3.–
Row0
Stálý člen
31. 8. 2015   #19
-
0
-

#16 ondrej39
pocet uzivatelu nepresahne pocet 10

Nahlásit jako SPAM
IP: 46.13.3.–
Kit+15
Guru
31. 8. 2015   #20
-
0
-

#18 Row
Pokud někdo tvrdí, že to nejde, nejspíš nepochopil tvoji otázku. Mně to trvalo 4 dny...

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ondrej39+1
Věrný člen
31. 8. 2015   #21
-
+1
-
Zajímavé
Row +

#19 Row
On je problém, že i při pivotování musíš ty uživatele vypsat ručně. A je to drbačka. Jakmile přidáš nebo odebereš uživatele, musíš měnit query. Proto by bylo možná lepší, kdybys data získával jinak. Stejně je na frontendu nevypisuješ ve formátu, který ti vypíše DB.

Nahlásit jako SPAM
IP: 78.156.159.–
Inject all the dependencies!
Kit+15
Guru
31. 8. 2015   #22
-
+1
-
Zajímavé

#21 ondrej39
Celkem jednoduchým řešením by mohl být dotaz obsahující GROUP BY state, telesale a následně to poslepovat do pivotu v aplikační vrstvě. Podobným způsobem dělám výpis stromového diskuzního fóra. Je to rychlé, snadno se to samo přizpůsobí a přitom stačí jediný (vcelku jednoduchý) SQL dotaz.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4016 příspěvků
31. 8. 2015   #23
-
+1
-
Zajímavé
Row +

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

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:1157:e4...–
Row0
Stálý člen
31. 8. 2015   #24
-
0
-

#23 peter

i kdyz ma uzivatel vsechny state nulove potrebuji ho tam.

suma v celku me nezajima to se da doresit v excelu potrebuju z DB tahat jen rozpad tech state na uzivatele

Nahlásit jako SPAM
IP: 46.13.3.–
peter
~ Anonymní uživatel
4016 příspěvků
31. 8. 2015   #25
-
0
-
Nahlásit jako SPAM
IP: 2001:718:2601:1f7:1157:e4...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

Podobná vlákna

Počet záznamů v celé DB — založil Nefaritus

Pocet záznamů dle DATA — založil Row

Počet záznamů vrácených seskupeným dotazem — založil Anonymní uživatel

Login uživatele — založil Counter

C# necinnost uzivatele — založil double

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý