Autor Zpráva
leonek
Profil
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
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
Problém je že mi nefunguje ten DISTINCT. Vypisuje to duplicitní záznamy.
Kajman
Profil
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
Ale na to distinc není. Ten vyhodí duplicity podle všech sloupců, ne podle jednoho. Mrkněte na group by.
leonek
Profil
Ale jak jsem pochopil z TOHOTO článku, nelze použít GROUP BY jen tak protože seznam sloupců v příkazu GROUP BY musí odpovídat seznamu sloupců v příkazu SELECT bez sloupců s agregačními funkcemi. Poradíte tedy pls jak GROUP BY pouze na sloupci 'email' aplikovat na ten první dotaz v [#1]?
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
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
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
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
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
Opraveno (snad).
Pokud chceš ty tabulky sloučit jednorázově, je lepší Torino řešení.
Kajman
Profil
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
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... :)

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: