Autor Zpráva
Manny
Profil *
Ahoj, pokouším se vyřešit následující problém - mám tabulky:
A:
id nazev number
-----------------------
1 pocasi 2
2 sport 2
3 kultura 2
....

B:
id den cislo
-------------------
1 po 2
2 ut 2
3 st 2
.....

a snažím se všechny dny z tabulky B, když jsou si rovny sloupce number a cislo - tohle se mi vypíše, ovšem problém je, že se mi to vypíše 3x tolik... čili 3x "po", 3x "ut", 3x "st"... zkouším to upravit tak, aby se mi vypsalo vždy jen jednou "po", "ut" a "st". Zkouším to následovně:
'SELECT DISTINCT A.number, A.*, B.cislo FROM A JOIN B ON A.number=B.cislo WHERE ... '


bohužel výsledek je pořád stejný, jako by tam ten distinct nebyl... (dotaz jsem zjednodušil pro přehlednost, ale na nic, co se funkčnosti týká jsem nezapomněl)

Neporadili byste prosím, v čem by mohl být zakopaný pes?
Díky
Kajman_
Profil *
Distinct porovnává všechny vypisované řádky. Mrkněte na group by a agregační funkce.
Manny
Profil *
tak jsem se pokusil něco vymyslet s tím GROUP BY a povedlo se mi to částečně:
Mám takovou strukturu:
A:

ID - NAZEV - NUMBER
================
1 - pocasi - 0
2 - kultura - 1
3 - sport - 2
4 - politika - 2
5 - hudba - 2


B:

ID - DEN - CISLO
================
1 - po - 0
2 - ut - 0
3 - st - 0
4 - ct - 0
5 - pa- 1
6 - so - 2
7 - ne - 2
8 - xx - 2

a já se snažím získat nenulová data z tabulky B. Když jsem to zkusil tím prvním dotazem, který jsem naznačil výše, vypsalo se mi 3x tolik výsledků. Zkusil jsem podle rady použít GROUP BY:
'SELECT  A.*, B.cislo FROM A JOIN B ON A.number=B.cislo WHERE B.cislo>0 GROUP BY B.cislo '


Ale tohle mi zase vypíše pouze 2 řádky (kde cislo=1 a cislo=2)... a já se snažím dostat řádky 4 z tabulky B (s indexy 5, 6, 7, 8)
nightfish
Profil
Manny:
a já se snažím dostat řádky 4 z tabulky B (s indexy 5, 6, 7, 8)
select * from b where b.cislo != 0

pokud ke každému z řádků z tabulky B chcete ještě všechny odpovídající "názvy" z tabulky A, tak (zhruba takto)
select b.*, group_concat(a.nazev) from b join a on b.cislo = a.number where b.cislo != 0 group by a.number
Manny
Profil *
nightfish:
uuf... jsme se do toho úplně zamotal... děkuji za Vaši radu.

já potřebuji vytáhnout z tabulky A všechny informace o nenulových řádcích ve sloupci NUMBER - v tabulce B mám doplňující informaci, kterou potřebuji vytáhnout - je to sloupec DEN. Tabulky jsou propojeny pomocí už zřejmých sloupců NUMBER-CISLO

i když jsem se snažil použít Vámi postnutou kontrukci, pořád jsem měl ten samý výsledek - čili výsledné 2 záznamy (o hodnotách 1, 2 - odpovídají hodnotam ve sloupci CISLO tabulky B) namísto těch čtyřech (1, 2, 2, 2)
Kajman_
Profil *
A který den chcete vytáhnout, když jich je tam víc?
123456789
Profil *
Kdybyste si přečetl základní info o GROUP BY (ideálně to navíc nestudoval na MySQL, ktrá podporuje zrůdnosti odporující logice 5-ti letého dítěte), tak byste se zde nemusel takto ptát a navíc byste to měl dávno vyřešené.

Pokud chcete vypsat všechny řádky, kde CISLO <> 0, přičemž atribut DEN se bude opakovat:

SELECT id,den,cislo FROM b WHERE cislo <> 0;

Pokud chcete vypsat všechny řádky, kde CISLO <> 0 a zároveň každý den a cislo bude unikátní pro výslednou množinu:

SELECT DISTINCT den,cislo FROM b WHERE cislo <> 0;
SELECT den,cislo FROM b WHERE cislo <> 0 GROUP BY den,cislo;

A konečně ono požadované spojení těchto dvou tabulek, kde CISLO <> 0 a DEN bude uveden jen jednou:

SELECT den,nazev FROM a, b WHERE a.number = b.cislo AND cislo <> 0 GROUP BY den,nazev;
Manny
Profil *
Kajman:
všechny... já se snažím vytáhnout ty nenulové řádkyz B tabulky (4 - 1, 2, 2, 2)
nightfish
Profil
Manny:
i když jsem se snažil použít Vámi postnutou kontrukci, pořád jsem měl ten samý výsledek - čili výsledné 2 záznamy (o hodnotách 1, 2 - odpovídají hodnotam ve sloupci CISLO tabulky B) namísto těch čtyřech (1, 2, 2, 2)
potřebujete spojit 4 řádky z tabulky A (id 2, 3, 4, 5) a 4 řádky z tabulky B (id 5, 6, 7, 8), ale nikde nepíšete jak
resp. je zřejmé, že řádek A.2 chcete spojit s B.5
ale jestli A.3 patří k B.6 nebo k B.7 už nevíme...
Manny
Profil *
tak už jsem to dal do kupy:
'SELECT DISTINCT A.number, B.cislo FROM A, B WHERE A.number=B.cislo AND B.cislo!=0'


Takhle mi to vypíše správný počet výsledků... Jen se potýkám s jedním "nedostatkem" - potřebuji znát všechny sloupce z tabulky A, ale potýkám se s problémem, jak to zapsat.

první možnost je taková:
SELECT DISTINCT A.number, A.id, A.name, B.cislo...

atp. - ale je to nešikovné, protože v tabulce A v reálu mám 15 sloupců, takže vyjmenovávat je je poněkud pracné.

zkusil jsem toto, ale to nefunguje:
SELECT DISTINCT A.number, A.*, B.cislo...


Existuje nějaký efektivnější způsob?
Děkuji
123456789
Profil *
EDIT: Navíc mi nejpřijde zrovna šťastně zvolená struktura těchto tabulek. Proč z tabulky b neodkazujete na sloupec id v tabulce a? Jak poznáme, že souvisí 3. řádek z tabulky a a 5. řádek z tabulky b a ne třeba 3. řádek z a a 6. z b? Respektive 6 - so - 2;...sobota má přiřazeno sport? politiku? nebo hudbu? nebo všechno?

Asi lepší by bylo něco jako:

A:

ID - NAZEV
========
1 - pocasi
2 - kultura
3 - sport
4 - politika
5 - hudba

B:

ID - DEN - CISLO
============
1 - po - 1
2 - ut - 1
3 - st - 1
4 - ct - 1
5 - pa- 3
6 - so - 4
7 - ne - 5
Manny
Profil *
123456789:
Ano, ve skutečnosti to tak je. Nahodil jsem to jen u 3 položek, aby se to nepletlo, ale zapletl jsem to tíhmle vidím ještě víc:) Ty nuly jsem tam přidal pro znázornění problému - ve skutečnosti mi to slouží k rozlišování kategorií a subkategorií
123456789
Profil *
Jinak * by se v selectu neměla moc používat. Jednak až případně do tabulky později přidáte nějaké atributy, které nebudete chtít vypisovat, tak ten dotaz stejně budete muset přepsat. Navíc takle si server navíc musí nejprve spočítat, kolik sloupců v dané tabulce je, zjistit jejich názvy, což je práce navíc.
Manny
Profil *
123456789:
ach ja... no, dám se tedy na to vypisování

Jinak děkuji všem, co se mi tu snažili poradit, vedlo to k úspěšnému konci :)
Kajman_
Profil *
123456789:
Navíc takle si server navíc musí nejprve spočítat, kolik sloupců v dané tabulce je, zjistit jejich názvy, což je práce navíc.

Myslíte, že je to nějak měřitelně práce navíc než kontrola, zda existují chtěné vyjmenované sloupce?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0