Autor Zpráva
Jiří164
Profil *
Dobrý den, mám nějakou takovouhle tabulku:
ID | Sloupec1 | Sloupec 2
A já chci vypisovat data ze Sloupce2 podle toho ID a pokud je tam hodnota ve SLoupec2 vícekrát, tak aby k tomu přidal hodnotu ze Sloupce1
Příklad:
ID | Sloupec1 | Sloupec2
1     A                B
2     X                Y
3     Z                Y

Výpis:
B, XY, ZY
Díky za pomoc
Tori
Profil
Pokud jsou výsledky seřazené podle sloupce 2, tak bych to řešila až ve skriptu. Tzn. číst z databáze oba sloupce a při výpise dat na každém řádku výsledků porovnat, jestli se sloupec2 v tomto řádku liší od sloupce2 z minulého řádku.
Jiří164
Profil *
No právě to seřazené není...myslel jsem dát do where nějakou podmínku, nebo to vypisovat nějak s distinctem...
Tori
Profil
Tyhle dva způsoby fungují. Pokud přidáte index na sloupec2, bude ten druhý dotaz o něco rychlejší. Ve výsledku je vždycky sloupec1, ale někdy bude prázdný (pokud hodnota ve sloupci2 je v tabulce jen jednou).

SELECT IF(COUNT(t2.id) > 1, t1.sloupec1, "") sloupec1, t1.sloupec2 
FROM tabulka t1
INNER JOIN tabulka t2 USING(sloupec2)
GROUP BY t1.id

SELECT IF(t2.cnt > 1, t1.sloupec1, "") sloupec1, t1.sloupec2 
FROM tabulka t1
INNER JOIN (
   SELECT sloupec2, COUNT(*) cnt 
   FROM tabulka 
   GROUP BY sloupec2
) t2 USING(sloupec2)
Jiří164
Profil *
děkuji, jak index na sloupec 2? myslíš unikátní klíč?


ten dotaz funguje, ale asi porovnává pouze první písmena. takže pokud mám ve sloupci2 více slov začínající třeba na T, ke všem mi to přidá hodnotu ze sloupec1...to už asi přes mysql nepůjde řešit že?
Tori
Profil
Jiří164:
Ne unikátní, vždyť se vám tam opakujou hodnoty. Obyčejný index.

asi porovnává pouze první písmena
Fakt? To by nemělo dělat. Můžete dát konkrétní příklad? Případně, jaké je na tom sloupci nastavené porovnávání?
Jiří164
Profil *
porovnání je utf8_czech_ci
ve sloupečku 2 mám slova začínající stejným písmenem a vrátí mi to u všech výsledky i se sloupečkem1. jinak snažím se do toho dotazu přidat i ID, ale hlásí mi to field list is ambiguous:
SELECT IF(COUNT(t2.id) > 1, t1.sloupec1, "") ID,sloupec1, t1.sloupec2 
FROM tabulka t1
INNER JOIN tabulka t2 USING(sloupec2)
GROUP BY t1.id
Tori
Profil
"sloupec1" je jen alias pro výsledek té podmínky. Další sloupce čtěte jen z té tabulky t1 (ta t2 je jen k tomu, aby se zjistilo, jestli stejných hodnot ve sloupci2 je tam víc nebo ne).
SELECT t1.id, IF(COUNT(t2.id) > 1, t1.sloupec1, "") AS sloupec1, t1.sloupec2 ... 
Jiří164
Profil *
No celý ten můj dotaz vypadá takto a nefunguje tak jak má:
SELECT IF( p2.`IDuzivatel` >1, p1.`Adresa` , "" ) `Adresa` , p1.`IDuzivatel` , p1.`Mesto`
FROM `uzivatele` AS p1
INNER JOIN `uzivatele` AS p2
USING ( `Mesto` )
GROUP BY p1.`IDuzivatel`


SELECT IF( p2.`IDuzivatel` >1, p1.`Adresa` , "" ) `Adresa` , p1.`IDuzivatel` , p1.`Mesto` 
FROM `uzivatele` AS p1 
INNER JOIN `uzivatele` AS p2 
USING ( `Mesto` ) 
GROUP BY p1.`IDuzivatel`
Tori
Profil
SELECT IF(COUNT(p2.`IDuzivatel`) >1, p1.`Adresa` , "" ) `Adresa` , ...
- chcete přece zjistit, jestli to město je tam víckrát, ne jaké má ID. (imho to ale fakt je jen otázka zobrazení, řešila bych to v šabloně / při výpisu)
Kajman
Profil
Tori:
chcete přece zjistit, jestli to město je tam víckrát, ne jaké má ID

No, moc jasně to popsané nemá, ale přijde mi, že chce id a pak nejkratší identifikátor z města a adresy - tedy pokud jen město jedinečné, tak stačí, jinak k němu přihodit přesnější adresu.

SELECT p1.`iduzivatel`,
       Concat_ws(', ', IF(t2.cnt > 1, p1.`adresa`, NULL), p1.`mesto`) identifikace
FROM   `uzivatele` AS p1
       INNER JOIN (SELECT `mesto`,
                          Count(*) cnt
                   FROM   `uzivatele`
                   GROUP  BY `mesto`) t2 USING(`mesto`)

Když tam je více podmínek, nikdy nevím, jak to ladně řešit. Když takto je těch sloupců víc. Např. si vypsat jen jména lidí a pokud tam není některé jednoznačné, vypsat si u nich rok narození a pokud stále není jednoznačné, vypsat si i měsíc a den a pokud ani potom, tak třeba rodné číslo nebo interní id.

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