Autor | Zpráva | ||
---|---|---|---|
Jiří164 Profil * |
#1 · Zasláno: 16. 4. 2013, 22:22:14
Dobrý den, mám nějakou takovouhle tabulku:
ID | Sloupec1 | Sloupec 2 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 |
#2 · Zasláno: 16. 4. 2013, 22:29:52
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 * |
#3 · Zasláno: 16. 4. 2013, 22:34:07
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 * |
#5 · Zasláno: 16. 4. 2013, 22:49:32 · Upravil/a: Jiří164
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 |
#6 · Zasláno: 16. 4. 2013, 23:03:21
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 * |
#7 · Zasláno: 16. 4. 2013, 23:07:49
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 |
#8 · Zasláno: 16. 4. 2013, 23:10:49
"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 * |
#9 · Zasláno: 16. 4. 2013, 23:18:13 · Upravil/a: Jiří164
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 |
#10 · Zasláno: 16. 4. 2013, 23:27:56
SELECT IF(COUNT(p2.`IDuzivatel`) >1, p1.`Adresa` , "" ) `Adresa` , ... |
||
Kajman Profil |
#11 · Zasláno: 17. 4. 2013, 01:38:22
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. |
||
Časová prodleva: 11 let
|
0