Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
27.06.2012 16:00:38
JOINT abi |
|
|
Ü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 |
|
 |
19Mart94
HV kasutaja
liitunud: 22.06.2010
|
27.06.2012 16:12:29
Re: JOINT abi |
|
|
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 |
|
|
Kommentaarid: 33 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
31 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
27.06.2012 16:36:00
|
|
|
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 |
|
 |
19Mart94
HV kasutaja
liitunud: 22.06.2010
|
|
Kommentaarid: 33 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
31 |
|
tagasi üles |
|
 |
napoleon
Unknown virus

liitunud: 08.12.2008
|
28.06.2012 09:52:40
|
|
|
Ää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 |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
28.06.2012 15:08:04
|
|
|
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 |
|
 |
19Mart94
HV kasutaja
liitunud: 22.06.2010
|
28.06.2012 15:22:21
|
|
|
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 |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
28.06.2012 15:39:27
|
|
|
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 |
|
 |
19Mart94
HV kasutaja
liitunud: 22.06.2010
|
28.06.2012 15:45:38
|
|
|
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 |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
28.06.2012 16:17:19
|
|
|
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 |
|
 |
19Mart94
HV kasutaja
liitunud: 22.06.2010
|
28.06.2012 17:00:44
|
|
|
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
|
|
Kommentaarid: 33 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
31 |
|
tagasi üles |
|
 |
napoleon
Unknown virus

liitunud: 08.12.2008
|
28.06.2012 17:32:24
|
|
|
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:
|
SELECT klientRA.id, klientRA.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM pildidRA INNER JOIN klientRA ON klientRA.id = pildidRA.kl_ID WHERE klientRA.sugu = 'Male' AND pildidRA.url = (SELECT url FROM pildidRA AS pra WHERE pra.kl_ID = klientRA.id ORDER BY RAND() LIMIT 1) ORDER BY RAND() LIMIT 2
|
|
|
Kommentaarid: 77 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
60 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
28.06.2012 17:41:59
|
|
|
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 |
|
 |
19Mart94
HV kasutaja
liitunud: 22.06.2010
|
28.06.2012 17:51:37
|
|
|
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
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 |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
28.06.2012 18:15:33
|
|
|
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 |
|
 |
napoleon
Unknown virus

liitunud: 08.12.2008
|
28.06.2012 18:16:50
|
|
|
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:
|
SELECT klientRA.id, klientRA.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM pildidRA INNER JOIN klientRA ON klientRA.id = pildidRA.kl_ID WHERE klientRA.sugu = 'Male' AND pildidRA.id = (SELECT id FROM pildidRA AS pra WHERE pra.kl_ID = klientRA.id ORDER BY RAND() LIMIT 1) ORDER BY RAND() LIMIT 5
|
|
|
Kommentaarid: 77 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
60 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
28.06.2012 18:49:16
|
|
|
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 |
|
 |
napoleon
Unknown virus

liitunud: 08.12.2008
|
28.06.2012 19:11:48
|
|
|
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:
|
SELECT k.id, k.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM (SELECT klientRA.id, klientRA.Knimi, (SELECT id FROM pildidRA AS pra WHERE pra.kl_ID = klientRA.id ORDER BY RAND() LIMIT 1) AS Pildid FROM klientRA WHERE klientRA.sugu = 'Male' ) AS k INNER JOIN FROM pildidRA ON pildidRA.id=k.Pildid ORDER BY RAND() LIMIT 2
|
|
|
Kommentaarid: 77 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
60 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
28.06.2012 20:32:21
|
|
|
See ei toimi üldse
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
napoleon
Unknown virus

liitunud: 08.12.2008
|
28.06.2012 20:56:40
|
|
|
Noh jah, kui oleksid veateadet vaadanud, oleks vist ise ka näpuka üles leidnud, korrektne on vist nii:
sql:
|
SELECT k.id, k.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM (SELECT klientRA.id, klientRA.Knimi, (SELECT id FROM pildidRA AS pra WHERE pra.kl_ID = klientRA.id ORDER BY RAND() LIMIT 1) AS Pildid FROM klientRA WHERE klientRA.sugu = 'Male' ) AS k INNER JOIN pildidRA ON pildidRA.id=k.Pildid ORDER BY RAND() LIMIT 2
|
ü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 |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
28.06.2012 21:48:53
|
|
|
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 |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
28.06.2012 23:03:55
|
|
|
andrusny kirjutas: |
Sellised mitmekihilised päringud näevad välja kui hiina ristsõna. Pole selliseid ennem kasutanud. |
napoleon kirjutas: |
sql:
|
SELECT k.id, k.Knimi, pildidRA.punkte, pildidRA.url, pildidRA.selgitus FROM ( SELECT klientRA.id, klientRA.Knimi, ( SELECT id FROM pildidRA AS pra WHERE pra.kl_ID = klientRA.id ORDER BY RAND() LIMIT 1 ) AS Pildid FROM klientRA WHERE klientRA.sugu = 'Male' ) AS k INNER JOIN pildidRA ON pildidRA.id=k.Pildid ORDER BY RAND() LIMIT 2
|
|
Natukene ehk on nüüd loetavam.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
|