Optimalizácia a vylepšenie SQL dopytu

Programovacie jazyky, rady, poradňa...
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Optimalizácia a vylepšenie SQL dopytu

Príspevok od používateľa weroro »

Ahoj,

snažím sa zlúčiť niekoľko SQL dopytov do jedného ale narazil som na problém, kde mi moje aktuálne vedomosti nepostračujú a chcem vás poprosiť o pomoc. Mám takúto štruktúru tabuliek.

Kód: Vybrať všetko

-- T1 --
ID  | AID   |   UID   |   NAME   |  TYP
1   | a1    |   u1    |   n1     |  1 
2   | a2    |   u2    |   n2     |  1

-- T2 --
ID  |  VALUE   |   AID   |   TYPE
1   |    v1    |   a1    |   ta
2   |    v2    |   a2    |   tb

-- T3 --
ID  | NAME  |   SPZ
1   | n1    |   s1
2   | n2    |   s2
A snažím sa vytiahnuť dáta takto:

Kód: Vybrať všetko

"SELECT
        T1.id, 
        T1.aid,
        T1.uid,
        T1.name AS t1n,
        T2.value, 
        T3.spz, 
        T3.name AS t3n 
FROM 
        T1, 
        T2, 
        T3 
WHERE 
        T1.typ='1'
    AND 
        (T2.aid=T1.aid 
      AND 
        T2.type='ta' 
      AND 
        T3.id=T2.value)"
Problém nastane ale v tedy, keď chcem z tabuľky T2 vytiahnuť ešte jeden údaj, z ďalšieho riadku, konkrétne údaj s typom tb. Viete prosím pomôcť? Ďakujem.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Optimalizácia a vylepšenie SQL dopytu

Príspevok od používateľa audiotrack »

Kód: Vybrať všetko

T2.type='ta' 
v podmienke zmeniť na

Kód: Vybrať všetko

(T2.type='ta' OR T2.type='tb' )
Či kde je problém?
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Optimalizácia a vylepšenie SQL dopytu

Príspevok od používateľa weroro »

Do čerta. :) Skúšal som používať OR ale toto by ma nenapadlo. Funguje to, i keď nie tak ako som si predstavoval ale funguje. Robí mi to duplicity, to znamená, že mi vyhodí 2x ten istý údaj ale s miernou zmenou. V prvej iterácii (while) mi vyhodí správne údaje ale bez hodnoty z druhého riadku tabuľky T2 a v druhej iterácii mi pod kľúčom 'value' vyhodí správny údaj (v2) avšak na základe toho údaju sa zas zmení hodnota v1 pod kľúčom t3n. Vyriešil som to podmienkou, a to tak, že si prvé pole (row) pri prvej iterácii uložím do tempu a pri druhej iterácii vypisujem dáta z tohto tempu a zároveň vyťahujem jeden údaj z aktuálneho row['value'].

Kód: Vybrať všetko

$i = 0;
$TMP = array();
while ($row = mysqli_fetch_array($vypis)) {
    if ($i % 2 > 0) {
        echo $row['value'];
        echo $TMP['value'];
    } else {
        $TMP = $row;
    }
    $i++;
}
miki690
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1255
Registrovaný: 07 okt 2005, 22:07
Bydlisko: KE
Kontaktovať používateľa:

Re: Optimalizácia a vylepšenie SQL dopytu

Príspevok od používateľa miki690 »

Toto mi pride na krasny priklad pouzitia join, osobne by som to spravil nejako takto

Kód: Vybrať všetko

SELECT T1.id,
       T1.aid,
       T1.uid,
       T1.name  AS t1n,
       T2.value,
       T3.spz,
       T3.name  AS t3n
FROM   T1
JOIN   T2 ON T1.aid = T2aid
      AND    T2.type = 'ta'
      OR T2.type='tb'
JOIN   T3 ON T3.id = T2.value;
pripadne ak chces vybrat vsetky zaznamy z t1 bez ohladu na to ci k nim existuje zaznam v ostatnych tabulkach, potrebne pouzit left join

Kód: Vybrať všetko

SELECT T1.id,
       T1.aid,
       T1.uid,
       T1.name  AS t1n,
       T2.value,
       T3.spz,
       T3.name  AS t3n
FROM   T1
LEFT JOIN   T2 ON T1.aid = T2aid
      AND    T2.type = 'ta'
      OR T2.type='tb'
LEFT JOIN   T3 ON T3.id = T2.value;
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Optimalizácia a vylepšenie SQL dopytu

Príspevok od používateľa audiotrack »

to si iba prepísal jeho query s použítím where na joiny. Jeho problém ktorý sa pýta to ale nerieši
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Optimalizácia a vylepšenie SQL dopytu

Príspevok od používateľa weroro »

To riešenie s OR (od audiotracka) "funguje", ale nastal problém. Ak vypisujem viacej záznamov a zoraďujem ich pomocou ORDER BY, tak vždy v jednom vypísanom zázname mi to vypľuje nesprávne údaje. Ak ORDER BY odstránim, je to v poriadku. Nevidím v tom chybovom vypísaní žiaden systém, takže je to náhodné a nedokážem presne určiť, ktorý záznam mi to pokazí.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8219
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Optimalizácia a vylepšenie SQL dopytu

Príspevok od používateľa harrison314 »

weroro: skus napisat, k tym tabulkam co mas hore aky vystup chces dostat, daco vymslim.
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Optimalizácia a vylepšenie SQL dopytu

Príspevok od používateľa weroro »

harrison: Ďakujem za ochotu. :) Nakoniec som to celé zvážil a dospel som k tomu, že to je zlý návrh databázy, takže som to mierne upravil a teraz sa pracuje s dátami jednoduchšie a dokonca to šľape aj rýchlejšie. Avšak predsa len mám jednu otázočku. Ako sa sa dá použiť ORDER By s viacerými parametrami? Potrebujem zoradiť výsledky podľa dvoch hodnôt.

Kód: Vybrať všetko

  TYP   |   TIME
   1    |   173
   1    |   654
   0    |   111
   1    |   121
   0    |   229
   0    |   893
a teraz potrebujem dosiahnuť nasledovné: TYP má prioritu pred TIME, čiže zoradím dáta podľa TYP (vyššie číslo bude prvé) a následne tieto vybrané údaje potrebujem ešte zoradiť podľa TIME.

niečo na spôsob ORDER BY typ, time DESC

Dá sa to nejako?
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: Optimalizácia a vylepšenie SQL dopytu

Príspevok od používateľa javatar »

samozrejme do order by mozes strcit viac veci - poradie triedenia bude podla poradia v order by

//edit: teraz pozeram, ze sa pytas ako - v podstate tak ako si napisal v priklade
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Optimalizácia a vylepšenie SQL dopytu

Príspevok od používateľa weroro »

Tak jednoduché to asi nebude, lebo ak mám teraz výpis zoradený iba podľa TIME, tak je vypísané v tomto poradí A-B-C-D:
ak zvýšim hodnotu TYP v zázname D, tak očakávam takýto výpis D-A-B-C

ORDER BY typ, time DESC (A-B-C-D)
ORDER BY typ OR time DESC (B-C-A-D)
ORDER BY typ AND time DESC (D-B-C-A)
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Optimalizácia a vylepšenie SQL dopytu

Príspevok od používateľa audiotrack »

ORDER BY typ DESC, time DESC
Napísať odpoveď