Avatar billede zurekk Nybegynder
02. april 2008 - 18:34 Der er 17 kommentarer og
1 løsning

1 fra `table1` og 5 fra `table2`

Hej eksperter,

Det jeg leder efter er en query som for hver række hentet fra `table1`, henter 5 relaterede rækker fra `table2`. Så vidt jeg ved findes der ingen limits på joins, så den går ikke.

Er der andre muligheder?

På forhånd tak.
Avatar billede arne_v Ekspert
02. april 2008 - 19:20 #1
proev:

SELECT *
FROM table1 JOIN (SELECT * FROM table2 WHERE table2.noget=table1.noget ORDER BY etellerandet LIMIT 5) x ON table1.foo=x.bar
Avatar billede zurekk Nybegynder
02. april 2008 - 20:42 #2
Hej Arne, det ligner da noget. Jeg har desværre ikke mulighed for at teste det før i morgen tidlig, men hvis du kan kigge herind en gang i morgen, så vil jeg have et svar klart.

Tak.
Avatar billede arne_v Ekspert
03. april 2008 - 01:52 #3
Det bør kunne bringes til at virke.

mysql> SELECT * FROM t1;
+----+------+
| F1 | F2  |
+----+------+
|  1 | A    |
|  2 | BB  |
|  3 | CCC  |
+----+------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM t1 a JOIN t1 b ON a.f1=b.f1;
+----+------+----+------+
| F1 | F2  | F1 | F2  |
+----+------+----+------+
|  1 | A    |  1 | A    |
|  2 | BB  |  2 | BB  |
|  3 | CCC  |  3 | CCC  |
+----+------+----+------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM t1 a JOIN (SELECT * FROM t1 b ORDER BY f1 LIMIT 2) x ON a.f1=x.f1;
+----+------+----+------+
| F1 | F2  | F1 | F2  |
+----+------+----+------+
|  1 | A    |  1 | A    |
|  2 | BB  |  2 | BB  |
+----+------+----+------+
2 rows in set (0.00 sec)
Avatar billede zurekk Nybegynder
03. april 2008 - 15:15 #4
SELECT * FROM _Categories c JOIN ( SELECT * FROM _Categories isc WHERE isc.parentc = c.id ORDER BY isc.name LIMIT 3 ) sc ON sc.parentc = c.id WHERE c.id = 1

Denne forespørgsel returnerer "Unknown column 'c.id' in 'where clause'".
Hvordan kan dette gøres? Jeg kan jo ikke hente alle rækker fra tabellen ud.
Avatar billede arne_v Ekspert
04. april 2008 - 01:27 #5
SELECT * FROM _Categories c JOIN (SELECT * FROM _Categories isc ORDER BY isc.name LIMIT 3) sc ON sc.parentc = c.id WHERE c.id = 1
Avatar billede zurekk Nybegynder
04. april 2008 - 13:52 #6
Hej Arne,

Ja den virker fint, det var også den jeg prøvede først.

Problemet med den er bare at jeg jo henter alle rækkerne ud, i min "inner-query", og det tvivler jeg på er særligt sundt for serveren hvis det skal gøres ofte og databasen har 100,000 rækker.

Men det fungerer måske ikke sådan?
Avatar billede arne_v Ekspert
04. april 2008 - 14:51 #7
Jeg antager at MySQL er smart nok til kun at hente de 3 foerste raekker og ikke henter alle
og saa smider alt undtagen de 3 vaek naar man har en LIMIT 3.

Det forudsaetter naturligvis at der er index paa isc.name !!
Avatar billede zurekk Nybegynder
04. april 2008 - 15:24 #8
Ja, den henter kun de 3 ud, men at den skal læse hele tabellen igennem for hver række den henter ud, er måske lige i overkanten?
Avatar billede arne_v Ekspert
04. april 2008 - 15:28 #9
Hvis der er index paa feltet der sorteres efter behover den ikke hente alle ud.
Avatar billede zurekk Nybegynder
04. april 2008 - 17:45 #10
Når jeg siger "hente ud", menes der ikke returnere alle rækkerne, men at den læser hele _Categories-tabellen når jeg laver min inner-select.

Jeg ved ikke hvordan SQL-databasen virker, men jeg forstår dette:
"(SELECT * FROM _Categories isc ORDER BY isc.name LIMIT 3) sc ON sc.parentc = c.id"
Som at den læser hele _Categories, og så vælger den så derefter de rækker ud som passer på min ON-statement.

Er det korrekt?
Avatar billede arne_v Ekspert
04. april 2008 - 17:54 #11
Sandsynligvis ikke !

(SELECT * FROM _Categories isc ORDER BY isc.name LIMIT 3)

boer hente 3 raekker ved brug af index paa isc.name.

For at verificere at dette er korrekt kan du enten bruge EXPLAIN kommandoen
eller teste hastigheden.
Avatar billede zurekk Nybegynder
04. april 2008 - 18:14 #12
Prøvede EXPLAIN. Den giver mig 3 rækker med en masse volapyk(for mig). Hvad leder jeg efter?
Avatar billede zurekk Nybegynder
04. april 2008 - 18:46 #13
Jeg skal nok oprette et spørgsmål med nogle flere points, og du kan evt. smide et svar for dette, nu.
Avatar billede arne_v Ekspert
04. april 2008 - 18:47 #14
proev og post dem - saa kan vi nok forklare
Avatar billede zurekk Nybegynder
04. april 2008 - 18:48 #15
Og mht. hastigheden:
"Viser poster 0 - 3 (4 total, Forepørgsel tog 0.0774 sek)"
Avatar billede arne_v Ekspert
04. april 2008 - 18:51 #16
Avatar billede arne_v Ekspert
04. april 2008 - 18:58 #17
og et svar
Avatar billede zurekk Nybegynder
04. april 2008 - 22:03 #18
Tak for hjælpen :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester