Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Mysql vali kõik read, mis on kasutusel teises tabelis märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
rang
HV kasutaja
rang

liitunud: 21.03.2005




sõnum 11.10.2010 13:25:10 Mysql vali kõik read, mis on kasutusel teises tabelis vasta tsitaadiga

Väike lihtne küsimus, kuidas saada kätte ühest tabelist kõik need read, mis on kasutusel teises tabelis?
Proovisin LEFT JOIN-i kasutada, kuid see ei käitunud nii, nagu oleks vaja, sest teises tabelis on esimese tabeli väärtusi mitmel korral.

Kui veidi detailsemaks minna, siis on mul kategooriate tabel ja toodete tabel. Mul on vaja kuvada kõik kategooriad, mis sisaldavad tooteid.
Kommentaarid: 3 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 3
tagasi üles
vaata kasutaja infot saada privaatsõnum
mirko28
Aeg maha 1p
mirko28

liitunud: 31.12.2003




sõnum 11.10.2010 15:23:32 vasta tsitaadiga

Seonduva vahe-teemana küsisin Oracle-foorumist, mida soovitatakse rohkem, kas "DISTINCT join"-i või "EXISTS (correlated subquery)" klauslit:
http://forums.oracle.com/forums/message.jspa?messageID=6505129
Kui kellelgi on miskit selle kohta lisada, siis saab teema-algataja küsimuse najal sellest teemast ka siin arutada.
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 11.10.2010 15:25:45 vasta tsitaadiga

Korduvate väärtuste hulgast ainult unikaalsete väärtuste leidmiseks on abiks võtmesõna DISTINCT.

Näiteks võiks ehk töötada midagi taolist (täpset sinu andmebaasistruktuuri ei tea loomulikult icon_smile.gif)
sql:
  1. SELECT DISTINCT k.id FROM kategooria AS k, toode AS t WHERE t.kat_id = k.id

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
rang
HV kasutaja
rang

liitunud: 21.03.2005




sõnum 11.10.2010 17:10:29 vasta tsitaadiga

Ma ei saa ikka hakkama.

Seletan siis lähemalt, mida ma üritan teha: mul on kolm tabelit
1. kategooriate tabel, kus on id ja kategooria nimi,
2. toodete tabel, mis sisaldab kõiki tooteid ja kus kasutatakse kategooria ID-d,
3. toodete tabel, kus asuvad kasutajatele näidatavate toodete ID-d

Kolmandast tabelist ei tulnud ennem pähe rääkida, nüüd juhuslikult torkas pähe mõte, et see on ka oluline. Selles tabelis on tooted, mida näidatakse kasutajatele. Mul on vaja kuvada vaid need kategooriad, milles on tooted ja nende ID-d asuvad kolmandas tabelis.

Iseenesest võiks teha eraldi päringutega asja ära, kuid see tundub olema veidi ebaeffektiivne, ning võiks ka vahelduseks keerulisema variandi õppimise eesmärgil valida.
Kommentaarid: 3 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 3
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 11.10.2010 17:22:14 vasta tsitaadiga

Kas sedasi ei tööta?
sql:
  1. SELECT DISTINCT k.id FROM kategooria AS k, toode AS t, avalik_toode AS a WHERE a.toode_id = t.toode_id AND k.kat_id = t.kat_id

Mugandada vastavalt vajadusele oma süsteemile sobivaks. icon_wink.gif

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
rang
HV kasutaja
rang

liitunud: 21.03.2005




sõnum 11.10.2010 18:02:13 vasta tsitaadiga

hakkas tööle jah. Tänan.
Kommentaarid: 3 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 3
tagasi üles
vaata kasutaja infot saada privaatsõnum
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 11.10.2010 22:13:10 vasta tsitaadiga

estrose kirjutas:
Seonduva vahe-teemana küsisin Oracle-foorumist, mida soovitatakse rohkem, kas "DISTINCT join"-i või "EXISTS (correlated subquery)" klauslit:
http://forums.oracle.com/forums/message.jspa?messageID=6505129
Kui kellelgi on miskit selle kohta lisada, siis saab teema-algataja küsimuse najal sellest teemast ka siin arutada.


Oleneb! Exists lause executitakse baasis "FOR" tsükli baasil ja sealt tulenevalt oleneb performance põhiquery ja subquerys olevate tabelite mahtudest ja indeksitest(kus tehakse full scan ja kus minnakse üle indeksi). Siin ei ole otsest vastust ning tõde tuleb ilmsiks sqlplusi ja autotrace abil - proovi erinevaid variante ja vaata plaani, saad aru mis toimub ja mida eelistada(muuta)
Kommentaarid: 8 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
mirko28
Aeg maha 1p
mirko28

liitunud: 31.12.2003




sõnum 14.10.2010 16:50:23 vasta tsitaadiga


SELECT DISTINCT k.id FROM kategooria AS k, toode AS t WHERE t.kat_id = k.id

versus

SELECT DISTINCT t.kat_id FROM kategooria AS k, toode AS t WHERE t.kat_id = k.id


Kumba neist soovitate ja miks? icon_smile.gif
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 14.10.2010 18:05:54 vasta tsitaadiga

Andmebaasimootorite sügavamat hingeelu ei tunne, seega ei hakka jõudluse koha pealt arvamust avaldama, kuhu kasutaja estrose ilmselt oma küsimusega sihib.

Küll aga ütleks ära, et antud juhul teemaalgataja kontekstis eelistaks ilmselt esimest varianti, kus päritakse andmeid kategooria tabelist, sest eeldatavasti tahetakse kategooria kohta ka muud teada peale id ning vajalikud väljad saab sama päringuga välja võtta. Antud juhul näites pärisin ainult id ilma pikemalt mõtlemata, samahästi oleks võinud pärida k.* tegelikult - lõppkokkuvõttes teemaalgataja kohendab päringu enda vajadustele vastavaks nii ehk naa.

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
kullar
HV kasutaja
kullar

liitunud: 26.11.2006



Autoriseeritud ID-kaardiga

sõnum 14.10.2010 18:43:07 vasta tsitaadiga

Miks ei kasuta inner joini? See ju tunduvalt kiirem ja DISTINCT on aeglasem kui GROUB BY
sql:
  1.  
  2. SELECT k.id
  3. FROM kategooria AS k
  4. INNRER JOIN toode AS t k.kat_id = t.kat_id
  5. INNER JOIN avalik_toode AS a ON  a.toode_id = t.toode_id
  6. GROUP BY k.ID
  7.  

Lisaks peaks andmebaasis olema ka vastavad indeksid.

_________________
Online Perekonna Eelarve, Keerukamad veebipõhised infosüsteemid jms
Kommentaarid: 27 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 25
tagasi üles
vaata kasutaja infot saada privaatsõnum
mirko28
Aeg maha 1p
mirko28

liitunud: 31.12.2003




sõnum 14.10.2010 19:02:52 vasta tsitaadiga

Fukiku kirjutas:
eeldatavasti tahetakse kategooria kohta ka muud teada peale id ning vajalikud väljad saab sama päringuga välja võtta.


Ilmselt küll. Vastasel juhul kui vaid ID-d on vaja, sest siis saaks päringu teha ka ilma JOINIita.
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Mysql vali kõik read, mis on kasutusel teises tabelis
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.