/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MySql og JOIN :-((
Fra : saluki-dk


Dato : 13-10-06 09:34

Hej

Jeg er nybegynder på MySql - og jeg er ved at flytte min dBaseIV
aplication med 19.000 hunde over i MySql
Jeg har styr på en del ting - den der med JOIN - den har jeg ikke styr

(og der er efter min fatige mening IKKE meget hjælp at hente i
Dokumentationen)

Jeg har denne simple forespørgsel, med en Bruger ($user), en list over
hvilkne hunde der er tilgængelig ($tlist)- og så skal jeg "bare" have
fundet dem, som brugeren har rettighed til - hvor svært kan det lige
være: ;-(((

$query = "SELECT CONCAT(Tenbase.kennel,' ',Tenbase.navn) AS hundnavn
   FROM Tenbase
   JOIN mklitter ON Tenbase.lnr = mklitter.lnr
   WHERE Tenbase.inr IN (" . $tlist . ")
      and (Tenbase.ejer_nr=$user
         or Tenbase.coejer_nr=$user
         or mklitter.bnr=$user
         or mklitter.cbnr=$user)
      ORDER BY hundnavn";

.....giver følgende fejl:

The SELECT would examine more rows than MAX_JOIN_SIZE. Check your WHERE
and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT
is ok
max_join_size er 33.554.432 - (har lige spurgt), Tenbase ~19.000
records, mklitter ~7.000 og $tlist ~700

Det er garanteret min JOIN der ikke virker - men jeg har "lånt" den
fra en anden funktion hvor den virker.

AHrraa...... - pls. hjælp mig

Venlig hilsen - Henrik Stampe


 
 
Kristian Damm Jensen (13-10-2006)
Kommentar
Fra : Kristian Damm Jensen


Dato : 13-10-06 13:28

saluki-dk wrote:
> Hej
>
> Jeg er nybegynder på MySql - og jeg er ved at flytte min dBaseIV
> aplication med 19.000 hunde over i MySql
> Jeg har styr på en del ting - den der med JOIN - den har jeg ikke styr
> på

I så fald vil jeg anbefale en grundbog i SQL. Der findes næsten ikke noget
der er mere basalt for databaser end join.

> (og der er efter min fatige mening IKKE meget hjælp at hente i
> Dokumentationen)

MySQL har ellers nogle udmærkede beskrivelser. Men der er tale om en manual,
ikke en lærebog.

> Jeg har denne simple forespørgsel, med en Bruger ($user), en list over
> hvilkne hunde der er tilgængelig ($tlist)- og så skal jeg "bare" have
> fundet dem, som brugeren har rettighed til - hvor svært kan det lige
> være: ;-(((
>
> $query = "SELECT CONCAT(Tenbase.kennel,' ',Tenbase.navn) AS hundnavn
> FROM Tenbase
> JOIN mklitter ON Tenbase.lnr = mklitter.lnr
> WHERE Tenbase.inr IN (" . $tlist . ")
> and (Tenbase.ejer_nr=$user
> or Tenbase.coejer_nr=$user
> or mklitter.bnr=$user
> or mklitter.cbnr=$user)
> ORDER BY hundnavn";

Be' om: Klip de dele, der ikke er SQL fra. Det andet forvirrer bare
billedet.

> ....giver følgende fejl:
>
> The SELECT would examine more rows than MAX_JOIN_SIZE. Check your
> WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the
> SELECT is ok
> max_join_size er 33.554.432 - (har lige spurgt), Tenbase ~19.000
> records, mklitter ~7.000 og $tlist ~700

Fejlen er at
19000x7000 =~ 140.000.000 > 33.554.432

Betingelserne i den where-klausul er sådan, at MySQL ikke har nogen mulighed
for at tage udgangspunkt i en delmængde af en af de to tabeller inden den
begynder på join'et. Den er derfor nødt til at skabe en midlertidig tabel
med samtlige kombinationer af rækker fra Tenbase og mklitter, dvs. et join
på rundt regnet 140 millioner rækker.

> Det er garanteret min JOIN der ikke virker - men jeg har "lånt" den
> fra en anden funktion hvor den virker.

Nix. Der er så vidt jeg kan se ikke noget principielt galt med din
forespørgsel.

Gør dig selv den tjeneste af lære lidt mere om SQL. Ellers ender du med at
lave det er blevet kaldt "programming by accident": Man prøver sig frem
indtil det virker, men man forstår ikke *hvorfor* det virker.

--
Regards,
Kristian Damm Jensen
"This isn't Jeopardy. Answer below the question."



Søg
Reklame
Statistik
Spørgsmål : 177455
Tips : 31962
Nyheder : 719565
Indlæg : 6408149
Brugere : 218880

Månedens bedste
Årets bedste
Sidste års bedste