Datagridview a duplicitní záznamy vč. spočítání   otázka

VB.NET, WinForms, Databáze

Dorbý den,

prosím o pomoc ...

Mám tabulku v databázi MYSQL kde je jeden uživatel třeba sedmkrát.

A potřeboval bych aby se z mysql dotazu vytvořil datagridview kde bude zobrazený každý uživatel a k tomu políčko ve kterém bude

zobrazeno kolikrát se záznam v tabulce vyskytuje.

Datagridview mi zobrazuje automaticky všechny pole a nic jako počet opakovaní jednoho záznamu tam není.

Nemám proto tušení jak jej do datagridview přidat + nakrmit ho počtem opakovaní jednoh záznamu.

Předem děkuji za pomoc a ochotu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Udělejte si normální SQL dotaz se SELECT COUNT a GROUP BY a plňte datagrid takto

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A kde bude uvedeno čislo kolikrát se daný záznam opakuje ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

http://interval.cz/clanky/sql-dotazy-s-a...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V samostatném sloupci. Doporučuji nastudovat alespoň základy SQL když už chcete pracovat s databází. To co chcete není o funkcích dataGridView ale o vhodně postaveném dotazu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

S databázemi zvládám základy a tohle je pro mě bohužel oříšek a proto se snažím dohledat pomoc zde ...

co sem pochopil z toho co datagrid zobrazuje, tak si myslím, že zobrazuje tabulku se všemi položkami které databáze obsahuje.

Ale není mi jasné jak do takto vytvořené sestavy, kterou mi zobrazí datagrid vložím sloupec navíc, který není součástí v mysql tabulce + příkaz který spočítá kolikrát se každý uživatel v databázi zobrazuje a doplní tyto údaje do toho sloupce, který bude navíc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

také nejsem expert, tak se omlouvám, pokud řeknu něco nepřesně, ale datagrid se plní metodou fill, do které si může dát v podstatě jakýkoli dotaz, nejjednodušeji tak, že ho vytvoříte podvojkliku na xsdsoubor -> pravím tlačítkem atd nebo když dáte u datagrid tu šipku v pravo nahoře, tak tam také něco jako add query...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

zároveň těch metod "fill" můžete mít víc, a vybrat tak co se v datagridu objeví podle okolností

nahlásit spamnahlásit spam 0 odpovědětodpovědět

tak už sem na to příšel

SELECT surname,name,COUNT(*) FROM obedyodhl WHERE id GROUP BY id;

fakt to není moc těžké ...

Dá se ten to co zobrazí jako count vynásobit nějakým číslem a zobrazit další pole ve kterém bude vynásobený výsledek?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

to by možná bylo lepší si na to udělat nový pohled (VIEW), ale nevim jestli VIEW může mít agregované sloupce (zatím jsem to nepotřeboval).... Vypočítávané sloupce ale umí každopádně

nahlásit spamnahlásit spam 0 odpovědětodpovědět

SELECT surname,name,(COUNT(*)*xx) as Pocet FROM obedydhl WHERE id GROUP BY id;

Kde xx bude číslo,kterým potřebujete násobit

nahlásit spamnahlásit spam 0 odpovědětodpovědět

na to už sem taky přišel ...

Ale teď nevím následující...

Mám dvě tabulky

1) Tabulka: tabulka ve které se ukládají záznamy ve kterých je několikrát zobrazen jeden uživatel s datumem odhlášených obědů.

Podle této tabulky systém výdeje nevydá oběd na uživatelovo ID.

2) Tabulka : všichni uživatelé co chodí na obědy

Dotaz:

Potřebuji zobrazit uživatele kteří si odhlásili obědy a zobrazit zbytek uživatelů, kteří si oběd neodhlásily. Výsledkem bude jedna tabulka kde budou všichni uživatele pouze jednou.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jinak to násobení také funguje :o)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vytvořte si nejlépe VIEW,ve kterém použijete příkaz JOIN - jenž si nastudujte :))

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A nemohl by mi někdo prosím pomoct s příkazem tak, abych jej mohl aplikovat na datagrid ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkoušel sem něco jako:

SELECT id FROM users WHERE id NOT IN (SELECT id FROM dietyodlh WHERE id)

Jenomže users je tabulka kde jsou všichni uživatelé a z těch potřebuji vybrat jenom ty kteří mají v kolonce "obed" zadano "odber"

nahlásit spamnahlásit spam 0 odpovědětodpovědět

SELECT * FROM users where obed='obder' and id NOT IN(SELECT id FROM dietyodlh)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuju, že mě to taky nenapadlo ...

a mohu teď dva dotazy na MYSLQ spojit do jednodo datagridu ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dva dotazy,proč dva? pokud je to složitější dotaz a bude sloužit jen pro upravený výpis dat,tak bych použil view...tzn.vytvořil view,které by bylo definováno právě tím složeným dotazem...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Potřebuji totiž provést:

1) zobrazit všechny uživatele kteří mají odhlášený oběd + spočítat počet odhlášení ( podle toho kolikrát se vyskytuje v tabulce )

2) zobrazit zbytek uživatelů, kteří na oběd také chodí ( podle tabulky users), ale jelikož si oběd neodhlásili, tak nejsou v tabulce odhlášených obědů.

To vše nasypat do datagridu a z něj pak exportuji excelovou tabulku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to bych zvolil cestu přes VIEW ;-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jako přímo nějaký příkaz v MYSQL ? nebo nějaký view v Vb.net ?

I když bych raději ten datagrid

nahlásit spamnahlásit spam 0 odpovědětodpovědět

View je typ objektu v DB... nastudujte si alespon trochu základy - bez tohoto se stejně v budoucnu v programování neobejdete...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

jelikož mě teď trošku tlačí čas a vb se učím sám tak se snažím jít cestou nejmenšího odporu.

Dva Sql příkazy zároveň není tedy možné provést tak, aby se promítnuly v jednom datagridu ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

pod cestou nejmenšího odporu si já představuji se naučit základy a pak řešit zbytek

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je mi jasné, že musím umět základy ( kdo by to řekl ...)

Ale jak sem již psal, bohužel mě tlačí čas, skočil sem do toho po pohlavě a jelikož si nevím rady tak vás zde prosím o pomoc a opravdu to poslední co potřebuji je moralizace...

Podařilo se mi spojit výše uvedené výběry ze dvou tabulek do jednoho datagridu.

V mysql sem vytovřil 2 * view ve kterých se nachází kýžené výsledky.

Ale když je nechám zobrazit v jednom datagridu

(Select * from view1,view2), tak se poskládají vedle sebe.

Mohu je nějak poskládat pod sebe ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

nedělejte blbosti, a udělejte si jedno view, kde pomocí join spojíte dvě tabulky a přidáte vypočítaný sloupec

Na googlu najdete každou z těch věcí za miuntu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak sem to zkusil jinak ...

První příkaz vybere všechny uživatele co mají přihlášené odběry obědů a vytvoří z toho view.

A teď si nevím rady jak postavit dotaz který spočítá, kolikrát se uživatelé z view vyskytují v odhlášených obědech tak, aby se mi ukázali i ti kteří nejsou v odhlášených obědech tzn. jejich méno se zobrazí s nulou.

Můžete mi prosím pomoct ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

prostudovat příkaz JOIN pořádně, tedy se vším všudy: LEFT JOIN vs RIGHT JOIN vs FULL JOIN. Myslím, že je to i tady na webu. zabere Vám to tak cca 5 minut.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nemyslím, že to zase až tak spěchá, abyste se nemohl naučit zákaldy, když to už řešíte tři dny :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

jo jo na join sem už koukal ...

ale nemužu přijít na podmínku ....

SELECT myview5.name, myview5.surname, count(*) FROM myview5 join dietyodlh WHERE (myview5.id=dietyodlh.id) group by surname

tohle mi zobrazí jenom ty uživatele, kteří jsou v obou tabulkách ...

ale netuším jak do toho sestavit podmínku, která přidá i ty uživatele kteří se tam nevyskytují

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Popravdě už přestávám rozumět tomu,proč se pouštíte do něčeho o čem nemáte evidentně ani ahnung.Kdyby jste místo zakládání topiců a psaní dalších začátečnických dotazů stále dokola,vzal nějaký tutoriál do SQL a .Net,tak uděláte 100x lépe a budete moci poté zakládat lépe popsané a určené topicy,na které se dá následně najít jedna relevantní odpověď.Tak to je to spíše flame,kde každý další příspěvek je jen další dotaz..Tohle jsou opravdu naprosté ZÁKLADY!!!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

a s tím left join

SELECT myview5.name, myview5.surname, count(*) FROM myview5 LEFT JOIN dietyodlh ON myview5.ID = dietyodlh.ID group by surname

ale v tabulce dietyodlh mám jednoho uživatele ( Petr ) 3x

v tabulce myview5 jednou

a count = 3

což podle počtu výskytu uživatele Petr v tabulce dietyodlh je správně

a teď nechápu proč se u uživatele Jana která není v tabulce dietyodlh zobrazí 1 když by tam přece mělo být nula podle myview5.ID = dietyodlh.ID ne ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nezlobte se že zakládám nový a špatně popsaný topic. ( je to věc toho jak vhodně formulovat dotaz na databázi místo počítání duplicitních výsledků v datagridu)

Ve vb. jsem dělal doposud pouze opravdu jednoduché aplikace, pro vkládání a čtení z databáze s čímž sem vystačil poměrně dlouho…

A k tomu sem taky přišel jako „slepý k houslím „ a zvládl sem to …

Ano , během toho sem prošel pár publikací jak „na to „ …

Teď potřebuji program rozšířit, jenomže na učení teď SKUTEČNĚ čas nemám.

Proto se obracím sem a žádám vás bohužel i se začátečnickými dotazy o pomoc, samozřejmě, že bych si rád vzal knížku, naučil se to a neztrapňoval se tady začátečnickými dotazy…

Sem si vědom toho, že vás to obtěžuje, ale prostě žene mě čas, tak jenom doufám, že se snad najde někdo kdo bude mít tu trpělivost a pokusí se mi poradit.

Jinak pokud víte o knihách, které skutečně dobře popisují mysql a vb budu rád za uvedení jejich názvů. Jasně knihkupectví je jich plné, ale pokud máte s nějakou dobrou zkušenost …

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Víte,v založení samotného topicu problém není.Jde o to,že se tu oháníte tím jak na nic nemáte čas a podobně,přitom samotný topic řešíte minimálně 3 dny.Za tu dobu byste stihl pročíst snad i manuál a tech.popis k jednotlivým příkazům a technologiím..

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dělám to během zaměstnání, kde na to teď vážně není čas a už vůbec né klid. Baví mě se učit takové věci, ale aktuálně na to nejsou podmínky...

A až se to tu uklidní, tak už budě pozdě, pač je potřeba, aby byl program připravený.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Už sem se dočetl proč se vrací 1 místo nuly ...

LEFT JOIN vráti i ty záznamy které nepodléhají podmínce...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Left join => vrátí VŠECHNA data z první (levé) tabulky+záznamy ze druhé které odpovídají podmínce

Right join => vrátí VŠECHNA data ze druhé (pravé) tabulky+záznamy z první které odpovídají podmínce

Inner Join => Vrátí data z obou tabulek pouze v případě že je splněna podmínka (pokud splněna není, nezobrazí se nic)

Tyto tři příkazy vemte v potaz. Trošku si s tím zaexperimentujte a za chvíli musíte mít výsledek.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Už to mám :o)

SELECT myview5.id,myview5.surname , count(dietyodlh.id) FROM myview5 LEFT JOIN dietyodlh ON myview5.id = dietyodlh.id group by myview5.id;

a přitom to vážně není žádna věda ...

no jo no sice po takové době, ale přece ...

Nic méně děkuju za "nakopnutí" jinak bych jeětě dlooooouho přemýšlel...

Jinak pokud máte typ na nějakou knihu, kde je opravdu dobře popsán .net tak budu rád za váš typ ...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback