Autor | Zpráva | ||
---|---|---|---|
leonek Profil |
#1 · Zasláno: 2. 10. 2014, 12:25:38
Dobrý den můžete mi pls pomoci zprovoznit tento dotaz:
SELECT distinct email, novinky, jmeno, mesto FROM( select email, novinky, jmeno, mesto from tabulka union select email, novinky, jmeno, nacionale from tabulka2) AS tt WHERE novinky='ano' ORDER BY jmeno |
||
juriad Profil |
#2 · Zasláno: 2. 10. 2014, 12:29:33
Co to píše za chybu?
Zkus toto: nacionale AS mesto |
||
Tori Profil |
V čem je chyba? Teda kromě toho, že by bylo efektivnější část
where přidat do obou dílčích selectů.
Jsou sloupce mesto a nacionale stejného datového typu? (= mají být)
|
||
leonek Profil |
#4 · Zasláno: 2. 10. 2014, 12:34:46
Problém je že mi nefunguje ten DISTINCT. Vypisuje to duplicitní záznamy.
|
||
Kajman Profil |
#5 · Zasláno: 2. 10. 2014, 12:46:50
leonek:
„nefunguje ten DISTINCT“ Takže máte dva řádky, kde jsou naprosto totožené hodnoty ve všech čtyřech vypisovaných sloupcích? Nejsou tam navíc nějaké mezery nebo něco podobného? |
||
leonek Profil |
Ten dotaz jsem měl jednou takto:
select distinct email from tab1 WHERE novinky='ano' union select distinct email from tab2 WHERE novinky='ano' ORDER BY id A to fungovalo. Ale teď jsem navíc potřeboval sbírat i jiné sloupce, přičemž potřebuji aby se nevypisovali řádky s duplicitnímy maily (tzmn. pouze jeden). |
||
Kajman Profil |
#7 · Zasláno: 2. 10. 2014, 13:10:26
Ale na to distinc není. Ten vyhodí duplicity podle všech sloupců, ne podle jednoho. Mrkněte na group by.
|
||
leonek Profil |
|||
juriad Profil |
leonek:
Ta poznámka platí jen pro databáze, které dodržují standardy. MySQL k nim nepatří, ta zkousne i horší prásny. Takže chceš každý email jen jednou, ale jaká data k němu (těch řádků může být více). V tabulce tab1: pepa@seznam.cz | 'ano' | 'pepa' | 'Praha' V tabulce tab2: pepa@seznam.cz | 'ano' | 'franta' | 'Brno' Co má být výsledkem? Jeden náhodný řádek z výše uvedených? Vadila by ti kombinace 'pepa' | 'brno'? A proč vlastně máš dvě tabulky, když obě obsahují data stejné povahy? |
||
leonek Profil |
#10 · Zasláno: 2. 10. 2014, 15:34:24
Výsledkem potřebuji od každého e-mailu jeden nehledě na ostatní data v řádku. Kombinace Pepa Brno by mi vadila. Chci z těchto dvou řádku náhodně jeden.
Tento dotaz předchází dalšímu třídění a ukládání do nové tabulky. Data jsou ve dvou tabulkách jelikož se jedná o dva různé zdroje a já z toho chci udělat jednu tabulku se specifickými vlastnostmi. |
||
Kajman Profil |
#11 · Zasláno: 2. 10. 2014, 15:45:28
leonek:
Jakou používáte databázi? |
||
juriad Profil |
SELECT vse.email, vse.novinky, vse.jmeno, vse.mesto FROM ( # tento subdotaz vybírá jen emaily a první zdroj ve kterém se nachází SELECT email, MIN(zdroj) AS zdroj # tady je ta povinná agregační funkce na negrupovaném sloupci FROM ( SELECT email, 'tab1' AS zdroj FROM tabulka1 WHERE novinky = 'ano' UNION SELECT email, 'tab2' AS zdroj FROM tabulka2 WHERE novinky = 'ano') AS tt GROUP BY email) AS vyber JOIN ( # tento dotaz vybírá vše a navíc i název zdroje SELECT email, novinky, jmeno, mesto, 'tab1' AS zdroj FROM tabulka1 WHERE novinky = 'ano' UNION SELECT email, novinky, jmeno, nacionale AS mesto, 'tab2' AS zdroj FROM tabulka2 WHERE novinky = 'ano') vse # tady se to pak propojí; řádek je identifikovaný emailem a zdrojem ON vyber.email = vse.email AND vyber.zdroj = vse.zdroj EDIT: bíle zvýrazněna původně chybějcí část na řádce 7, která způsobovala chybu |
||
leonek Profil |
#13 · Zasláno: 2. 10. 2014, 16:18:39
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in....
Ještě otázečka: na co jsou tam řádky 10, 15, 25, 33? Pochopil jsem to jak zbytečnou nezbytnost kvůli GROUP BY. |
||
juriad Profil |
leonek:
Je tam nějaká syntaktická chyba, zkontroluj mysql_error, ten dotaz jsem nezkoušel. To je tam z toho důvodu, aby jsi věděl, který ze záznamů vybrat. Ten první subdotaz říká, ze které tabulky pochází ten který email; následně ve druhém dotazu takový řádek najdeš. Kdyby to tam nebylo, tak první dotaz vrátí všechny emaily ze všech tabulek a druhý vybere všechny záznamy, které ten email obsahují, tedy často i duplicity. |
||
Tori Profil |
leonek:
> Kombinace Pepa Brno by mi vadila. Chci z těchto dvou řádku náhodně jeden. ... se jedná o dva různé zdroje a já z toho chci udělat jednu tabulku se specifickými vlastnostmi. A nebyl by teda jednodušší postup: - vytvořit tu tabulku a nastavit unikátní index přes sloupce jmeno+mesto - pomocí INSERT IGNORE ... SELECT anebo INSERT ... ON DUPLICATE KEY UPDATE... SELECT tam nalít data (a v selectu profiltrovat)
- unik.klíč odstranit ? |
||
leonek Profil |
#16 · Zasláno: 2. 10. 2014, 16:28:39
juriad:
MySQL ERROR: Unknown column 'vyber.zdroj' in 'on clause' Omlouvám se, trochu se orientuji, ale přece jenom tyhle složené výrazy jsou na mě ještě moc... |
||
juriad Profil |
#17 · Zasláno: 2. 10. 2014, 16:32:23
Opraveno (snad).
Pokud chceš ty tabulky sloučit jednorázově, je lepší Torino řešení. |
||
Kajman Profil |
#18 · Zasláno: 2. 10. 2014, 21:44:56
juriad
Pokud bude více řádků se stejným e-mailem v některé tabulce, tak to nepomůže. leonek: U mysql můžete použít ono insert ignore, nebo při nezapnutém ONLY_FULL_GROUP_BY módu není vyžadována podmínka zmíněná v [#8] platná pro ostatní databáze. SELECT email, novinky, jmeno, mesto FROM (SELECT DISTINCT email, novinky, jmeno, mesto FROM tabulka WHERE novinky = 'ano' UNION SELECT DISTINCT email, novinky, jmeno, nacionale AS mesto FROM tabulka2 WHERE novinky = 'ano') AS tt GROUP BY email ORDER BY jmeno |
||
leonek Profil |
#19 · Zasláno: 3. 10. 2014, 15:32:32
Tak Kajmanovo řešení bylo nejlepší což je v podstatě odpověď na [#8]. juriadovo řešení mi vyplivlo o dvě desítky záznamů více a našel jsem tam pár duplicit, ale také mu velmi děkuji za pomoc s pochopením složených dotazů.
Moc děkuji všem, snad mne již problematika složených dotazů (tolik) trápit nebude... :) |
||
Časová prodleva: 10 let
|
0