Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  JOINT abi 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:  
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 27.06.2012 16:00:38 JOINT abi vasta tsitaadiga

Üritan leida kahe tabeli pealt kokku kasutajaid kus ühest võetakse kõik mehed ja teise järi pannakse need punktide järgi ritta.

$sql="SELECT klientRA.id, klientRA.Knimi FROM klientRA RIGHT JOIN pildidRA ON klientRA.sugu = 'Male' ORDER BY pildidRA.punkte DESC";


Kuid nüüd tekib mul olukord, kus kõik mehed pannakse nii mitu korda ritta, kui on pilte.
Ehk saite aru mida üritan ja oskate aidata.

panen tabelduse ka

pildidRA

id int(11) NOT NULL auto_increment,
kl_ID int(11) NOT NULL, // see on klientRA ID
url text NOT NULL,
selgitus text NOT NULL,
punkte int(11) NOT NULL,

klientRA

id int(11) NOT NULL auto_increment,
Knimi text NOT NULL,
Enimi text NOT NULL,
Pnimi text NOT NULL,
parol text NOT NULL,
zip text NOT NULL,
Epost text NOT NULL,
sugu text NOT NULL,

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
19Mart94
HV kasutaja

liitunud: 22.06.2010



Autoriseeritud ID-kaardiga

sõnum 27.06.2012 16:12:29 Re: JOINT abi vasta tsitaadiga

andrusny kirjutas:
Üritan leida kahe tabeli pealt kokku kasutajaid kus ühest võetakse kõik mehed ja teise järi pannakse need punktide järgi ritta.

$sql="SELECT klientRA.id, klientRA.Knimi FROM klientRA RIGHT JOIN pildidRA ON klientRA.sugu = 'Male' ORDER BY pildidRA.punkte DESC";


Kuid nüüd tekib mul olukord, kus kõik mehed pannakse nii mitu korda ritta, kui on pilte.
Ehk saite aru mida üritan ja oskate aidata.

panen tabelduse ka

pildidRA

id int(11) NOT NULL auto_increment,
kl_ID int(11) NOT NULL, // see on klientRA ID
url text NOT NULL,
selgitus text NOT NULL,
punkte int(11) NOT NULL,

klientRA

id int(11) NOT NULL auto_increment,
Knimi text NOT NULL,
Enimi text NOT NULL,
Pnimi text NOT NULL,
parol text NOT NULL,
zip text NOT NULL,
Epost text NOT NULL,
sugu text NOT NULL,

Select klientRA.id, klientRA.Knimi From klientRA Join pildidRA On klientRA.id = pildidRA.kl_ID Where klientRA.sugu = 'Male' Order By pildidRA.punkte Desc


thumbs_up.gif
Kommentaarid: 33 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 31
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 27.06.2012 16:36:00 vasta tsitaadiga

Tänud.
Ma ise tulin ka pika mõtlemisega selle peale, et tuleb kuidagi tabelite id võrrelda.
Üks veidi loll küsimus ehk, mida annab see RIGHT ja LEFT seal juures.

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
19Mart94
HV kasutaja

liitunud: 22.06.2010



Autoriseeritud ID-kaardiga

sõnum 27.06.2012 16:40:30 vasta tsitaadiga

andrusny kirjutas:
Tänud.
Ma ise tulin ka pika mõtlemisega selle peale, et tuleb kuidagi tabelite id võrrelda.
Üks veidi loll küsimus ehk, mida annab see RIGHT ja LEFT seal juures.

See tuleb mul iseenesest, muidu on see seotud sellega, kas leitakse kummagist (parempoolsest, vasakpoolsest tabelist) andmeid.
Lisalugemist:
http://www.w3schools.com/sql/sql_join_left.asp
http://www.w3schools.com/sql/sql_join_right.asp
Kommentaarid: 33 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 31
tagasi üles
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 28.06.2012 09:52:40 vasta tsitaadiga

Ääremärkusena lisan, et kui see päringut oluliselt keerukamaks ei muuda, siis loetavuse huvides on soovitav ehitada päring nii üles, et kasutatakse LEFT JOIN'i või INNER JOIN'i.
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 28.06.2012 15:08:04 vasta tsitaadiga

Tekkis veel seoses päringuga probleeme, mis pole kül otseselt vist JOINT seotud. Nimelt samad kaks tabelit ja see päring toimib kenasti, kuid oleks vaja lisada, et ta ei võtaks sama kasutaja käest (klientRA.id või pildidRA.kl_ID) mõlemaid pilte.
Kas selle saab sql põhiselt lahendada või tuleb php koodi siseselt teha midagi?

$sql="SELECT klientRA.id, klientRA.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM pildidRA JOIN klientRA ON  klientRA.id = pildidRA.kl_ID WHERE klientRA.sugu = 'Male'  ORDER BY RAND() LIMIT 2";

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
19Mart94
HV kasutaja

liitunud: 22.06.2010



Autoriseeritud ID-kaardiga

sõnum 28.06.2012 15:22:21 vasta tsitaadiga

andrusny kirjutas:
Tekkis veel seoses päringuga probleeme, mis pole kül otseselt vist JOINT seotud. Nimelt samad kaks tabelit ja see päring toimib kenasti, kuid oleks vaja lisada, et ta ei võtaks sama kasutaja käest (klientRA.id või pildidRA.kl_ID) mõlemaid pilte.
Kas selle saab sql põhiselt lahendada või tuleb php koodi siseselt teha midagi?

$sql="SELECT klientRA.id, klientRA.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM pildidRA JOIN klientRA ON  klientRA.id = pildidRA.kl_ID WHERE klientRA.sugu = 'Male'  ORDER BY RAND() LIMIT 2";


Et võtaks ainult ühe pildi igalt kasutajalt?
Kommentaarid: 33 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 31
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 28.06.2012 15:39:27 vasta tsitaadiga

Jah täpselt. Et ei tekiks olukorda, kus on kaks sama kasutaja pilti.
Vaatasin saab võtta ainult ühe ühesuguse kl_ID
$sql="SELECT DISTINCT kl_ID FROM pildidRA";


nagu ainult sarnased kasutaja id ühe korra, kuias seda nüüd rakendada selles päringus? Selliselt talle ei meeldi.

$sql="SELECT pildidRA.kl_ID, klientRA.id, klientRA.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM pildidRA JOIN klientRA ON  klientRA.id =  DISTINCT  pildidRA.kl_ID WHERE klientRA.sugu = 'Male'  ORDER BY RAND() LIMIT 2";

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
19Mart94
HV kasutaja

liitunud: 22.06.2010



Autoriseeritud ID-kaardiga

sõnum 28.06.2012 15:45:38 vasta tsitaadiga

andrusny kirjutas:
Jah täpselt. Et ei tekiks olukorda, kus on kaks sama kasutaja pilti.
Vaatasin saab võtta ainult ühe ühesuguse kl_ID
$sql="SELECT DISTINCT kl_ID FROM pildidRA";


nagu ainult sarnased kasutaja id ühe korra, kuias seda nüüd rakendada selles päringus? Selliselt talle ei meeldi.

$sql="SELECT pildidRA.kl_ID, klientRA.id, klientRA.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM pildidRA JOIN klientRA ON  klientRA.id =  DISTINCT  pildidRA.kl_ID WHERE klientRA.sugu = 'Male'  ORDER BY RAND() LIMIT 2";


Peaks rahuldama:
SELECT pildidRA.kl_ID, klientRA.id, klientRA.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM pildidRA JOIN klientRA ON  klientRA.id = pildidRA.kl_ID WHERE klientRA.sugu = 'Male' Group By klientRA.id ORDER BY RAND()

See võtab siis igale kasutajale ainult ühe pildi siis
Kommentaarid: 33 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 31
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 28.06.2012 16:17:19 vasta tsitaadiga

Pole päris see ta võtab alati sama pildi kasutajal rand peaks käima pildi kausta kohta, hetkel tundub, et rand vahetab ainult kasutajate järjekorda, kuid pilt võetakse alati esimene ID, mis pildikaustas juhtub olema sellel kasutajal.
_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
19Mart94
HV kasutaja

liitunud: 22.06.2010



Autoriseeritud ID-kaardiga

sõnum 28.06.2012 17:00:44 vasta tsitaadiga

Siis:

SELECT * FROM  (SELECT pildidRA.kl_ID, klientRA.id, klientRA.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM pildidRA JOIN klientRA ON  klientRA.id = pildidRA.kl_ID WHERE klientRA.sugu = 'Male' ORDER BY RAND()) as klientRA GROUP BY klientRA.id

Samas olen üsna kindel, et saab kiiremalt teha seda icon_neutral.gif
Kommentaarid: 33 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 31
tagasi üles
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 28.06.2012 17:32:24 vasta tsitaadiga

Sellisel moel GROUP BY kasutamine on IMHO väga kahtlase väärtusega... huvitav kas mõni muu baas peale MySQL'i üldse sellise sopa alla neelab.
Korrektne, aga tõenäoliselt mitte just parima jõudlusega päring oleks midagi sellist:
sql:
  1. SELECT
  2. klientRA.id,
  3. klientRA.Knimi,
  4. pildidRA.punkte,
  5. pildidRA.url,
  6. pildidRA.selgitus
  7. FROM pildidRA
  8. INNER JOIN klientRA ON klientRA.id = pildidRA.kl_ID
  9. WHERE klientRA.sugu = 'Male'
  10. AND pildidRA.url = (SELECT url FROM pildidRA AS pra WHERE pra.kl_ID = klientRA.id ORDER BY RAND() LIMIT 1)
  11. ORDER BY RAND() LIMIT 2
  12.  
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 28.06.2012 17:41:59 vasta tsitaadiga

Kui lisan siia nüüd LIMIT 2 tekib mõni kord olukord, kus väljastab ainult ühe rea. Millest selline kamm?

SELECT * FROM  (SELECT pildidRA.kl_ID, klientRA.id, klientRA.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM pildidRA JOIN klientRA ON  klientRA.id = pildidRA.kl_ID WHERE klientRA.sugu = 'Male' ORDER BY RAND() LIMIT 2) as klientRA GROUP BY klientRA.id


Edit: Tänud napoleon täpselt seda mulle vaja oligi, see toimib korrektselt.

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
19Mart94
HV kasutaja

liitunud: 22.06.2010



Autoriseeritud ID-kaardiga

sõnum 28.06.2012 17:51:37 vasta tsitaadiga

andrusny kirjutas:
Kui lisan siia nüüd LIMIT 2 tekib mõni kord olukord, kus väljastab ainult ühe rea. Millest selline kamm?

SELECT * FROM  (SELECT pildidRA.kl_ID, klientRA.id, klientRA.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM pildidRA JOIN klientRA ON  klientRA.id = pildidRA.kl_ID WHERE klientRA.sugu = 'Male' ORDER BY RAND() LIMIT 2) as klientRA GROUP BY klientRA.id


Edit: Tänud napoleon täpselt seda mulle vaja oligi, see toimib korrektselt.

Mainin ära, et sa lisasid Limit 2 valesse kohta icon_rolleyes.gif

SELECT * FROM  (SELECT pildidRA.kl_ID, klientRA.id, klientRA.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM pildidRA JOIN klientRA ON  klientRA.id = pildidRA.kl_ID WHERE klientRA.sugu = 'Male' ORDER BY RAND()) as klientRA GROUP BY klientRA.id LIMIT 2


Edit: napoleon-i kood kuvab ka mul vahepeal ühe vaste ainult
10 korda uuendamist, millest 4-l korral kuvas ainult ühe vaste

Minu viimane kood samas kuvas alati kaks vastet (see, mis siin postituses)...
Kommentaarid: 33 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 31
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 28.06.2012 18:15:33 vasta tsitaadiga

Lisasin vägagi õigesse kohta, sinul annab nüüd kahe kasutaja random pilte. Õigemini tabeli esimesed kaks kasutajat, esimesel pildid muutuvad, teisel seisab ees tabeli esimene pilt ja ei muutu. Kui lisada rand sinna kus mul siis rand toimib õigesti, kuid jätab kahe pildi asemel vahest ühe.

Pikema klõpsimisega avastasin, et ka kasutaja napoleon kood teeb vahel sama tüki.

Kas see rand annab sama tulemuse mis php rand algab 0 äkki peaks talle 1 juurde liitma aga see vist veidi jama mõte.
edit proovisin toimib, kuid ikka kkunagi tuleb ainult 1 vaste. ( 25x )

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 28.06.2012 18:16:50 vasta tsitaadiga

Mis juhtub kui paned näiteks LIMIT 5? Veel vaatasin, et kasutad andmetüüpi text, mina kasutaks pigem varchar tüüpi kui tegemist pole just artikli/postituse sisu vms. mahuka tekstiga. Võimalik, et sellise välja võrdlemine tekitab mingeid kalasid, proovi siis midagi sellist:
sql:
  1.  
  2. SELECT
  3. klientRA.id,
  4. klientRA.Knimi,
  5. pildidRA.punkte,
  6. pildidRA.url,
  7. pildidRA.selgitus
  8. FROM pildidRA
  9. INNER JOIN klientRA ON klientRA.id = pildidRA.kl_ID
  10. WHERE klientRA.sugu = 'Male'
  11. AND pildidRA.id = (SELECT id FROM pildidRA AS pra WHERE pra.kl_ID = klientRA.id ORDER BY RAND() LIMIT 1)
  12. ORDER BY RAND() LIMIT 5
  13.  
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 28.06.2012 18:49:16 vasta tsitaadiga

tsitaat:
Mis juhtub kui paned näiteks LIMIT 5?

Täpselt sama, panin counteri väljatrükile külge mõni üksik kord tuleb 4 pilt, kuid nii ma vist peangi lahendama, kui midagi paremat välja ei mõtle, võtan LIMIT 3 ja kasutan kahte esimest, kui tuleb 2 ei jää ikka pilte puudu.

edit: ka id kasutades jätab mõnikord ühe vähem, kui LIMIT määratud. Ja mõni üksik kord tuleb ikkagi ka sama kasutaja pilte kaks tükki. müstika

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 28.06.2012 19:11:48 vasta tsitaadiga

Njaah, see JOIN ikka päris nii ei toimi, server hakkab seda teistpidi närima ja võib ka juhtuda, et ei saa ühtegi rida. Toimiv variant peaks olema hoopis midagi sellist:
sql:
  1.  
  2. SELECT k.id, k.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus
  3. FROM
  4. (SELECT
  5. klientRA.id,
  6. klientRA.Knimi,
  7. (SELECT id FROM pildidRA AS pra WHERE pra.kl_ID = klientRA.id ORDER BY RAND() LIMIT 1) AS Pildid
  8. FROM klientRA
  9. WHERE klientRA.sugu = 'Male'
  10. ) AS k
  11. INNER JOIN FROM pildidRA ON pildidRA.id=k.Pildid
  12. ORDER BY RAND()
  13. LIMIT 2
  14.  
  15.  
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 28.06.2012 20:32:21 vasta tsitaadiga

See ei toimi üldse
_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 28.06.2012 20:56:40 vasta tsitaadiga

Noh jah, kui oleksid veateadet vaadanud, oleks vist ise ka näpuka üles leidnud, korrektne on vist nii:
sql:
  1.  
  2. SELECT k.id, k.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus
  3. FROM
  4. (SELECT
  5. klientRA.id,
  6. klientRA.Knimi,
  7. (SELECT id FROM pildidRA AS pra WHERE pra.kl_ID = klientRA.id ORDER BY RAND() LIMIT 1) AS Pildid
  8. FROM klientRA
  9. WHERE klientRA.sugu = 'Male'
  10. ) AS k
  11. INNER JOIN pildidRA ON pildidRA.id=k.Pildid
  12. ORDER BY RAND()
  13. LIMIT 2
  14.  
  15.  


üldiselt peaks see foorum olema ju ikka selline, kus antakse õng mitte kala... minul sama baasi ju katsetamiseks pole ja ei viitsi tekitada ka;)
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 28.06.2012 21:48:53 vasta tsitaadiga

Suured tänud, seekord toimib. Eks ta ole ikka nii, lase sant sauna, siis aita lavale ka. Sellised mitmekihilised päringud näevad välja kui hiina ristsõna. Pole selliseid ennem kasutanud.
_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 28.06.2012 23:03:55 vasta tsitaadiga

andrusny kirjutas:
Sellised mitmekihilised päringud näevad välja kui hiina ristsõna. Pole selliseid ennem kasutanud.
napoleon kirjutas:
sql:
  1. SELECT
  2. k.id,
  3. k.Knimi,
  4. pildidRA.punkte,
  5. pildidRA.url,
  6. pildidRA.selgitus
  7. FROM
  8. (
  9.   SELECT
  10.   klientRA.id,
  11.   klientRA.Knimi,
  12.   (
  13.     SELECT
  14.     id
  15.     FROM pildidRA AS pra
  16.     WHERE pra.kl_ID = klientRA.id
  17.     ORDER BY RAND()
  18.     LIMIT 1
  19.   ) AS Pildid
  20.   FROM klientRA
  21.   WHERE klientRA.sugu = 'Male'
  22. ) AS k
  23. INNER JOIN pildidRA ON pildidRA.id=k.Pildid
  24. ORDER BY RAND()
  25. LIMIT 2
Natukene ehk on nüüd loetavam.
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  JOINT abi
[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.