Avatar billede teekay Nybegynder
25. juni 2008 - 12:48 Der er 9 kommentarer og
1 løsning

Fejl ved sortering af en query

Jeg har lavet den her query.. og den har faktisk virket udmærket indtil her den anden dag.

  $query = mysql_query("SELECT votes.id, votesData.voteId,
      (SELECT COUNT(voteId)
      FROM votesData
      WHERE votesData.voteId = votes.id) AS count
      FROM votes
      LEFT JOIN votesData
      ON votesData.userId = ".$_SESSION['userId']." AND votes.id = votesData.voteId
      WHERE votesData.userId IS NULL
      ORDER BY count DESC");
  $num = mysql_numrows($query);

Fandt så ud af at fejlen forsvinder hvis jeg sletter ca. 100 poster fra votesData (den indeholder 68159 poster).

Er mit query lavet uhensynsmæssigt, eller er der noget andet der spiller ind? Det skal lige siges at hvis jeg fjerner ORDER BY delen virker alt fint igen!?
Avatar billede teekay Nybegynder
25. juni 2008 - 13:01 #1
Altså problemet forsvinder hvis jeg sletter ORDER BY count DESC men det har virket før!! Hvilket også bekræftes ved at det virker når jeg sletter ca. 100 poster fra databasen, men det er jo ikke en holdbar løsning.

votesData indeholder 3 x int(11) og 1 x date

Hjæælp :)
Avatar billede nur0701 Nybegynder
25. juni 2008 - 13:53 #2
Kan det være fordi du skal skifte datatypen fra "int" til "bigint", og så sørge for at den er "unsigned". Kunne være et forslag, har set flere af disse fejl og plejer typisk at have noget at gøre med dette.

Håber det kan hjælpe.

Må gerne lige sige til hvis jeg er langt fra. xD
Avatar billede pidgeot Nybegynder
25. juni 2008 - 13:55 #3
...jeg har en ide om at det ikke er tilfældet her.

Hvordan fejler den mere præcist? Nogle fejlmeddelelser eller noget? Ser det rigtigt ud hvis du kører queryen manuelt med eks. PHPMyAdmin?
Avatar billede teekay Nybegynder
25. juni 2008 - 14:05 #4
nur0701: Jeg indrømmer gerne jeg ikke ved så meget om datatyperne.. men jeg har en anden tabel med over 6.000.000 poster hvor id er int(11) og det kører uden problemer.. men ved som sagt ikke så meget om det..

Hvad vil det sige at den er "unsigned" ?


pidgeot: Den siger

Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in ... on line 261

og fjerner jeg $num

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ... on line 333

MEN! i phpmyadmin siger den

#1104 - The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

Er så aldrig stødt på det før, men det lader til at være problemet.. Nogen tips til hvordan jeg fikser det.. Eller er det bedst jeg omskriver min query (forslag??)
Avatar billede pidgeot Nybegynder
25. juni 2008 - 14:38 #5
PHPMyAdmin siger jo sådan set hvad du skal gøre - kør SET SQL_BIG_SELECTS=1 umiddelbart inden din query eller sæt det permanent op i MySQL's konfiguration.

Problemet er at MySQL kommer til at kigge på rigtig mange rækker, og den er så sat op til at stoppe hvis det sker - fordi den mistænker du måske har lavet en fejl. Ved at køre den der SET SQL_BIG_SELECTS=1, siger du til MySQL "Det er OK, bare kør den SELECT."

Det er dog ikke det samme som at din query og/eller databasestruktur ikke kan gøres bedre - det ved jeg ikke med sikkerhed uden at vide mere om hvad du prøver at hente ud.
Avatar billede teekay Nybegynder
25. juni 2008 - 14:49 #6
Kanon.. Vil lige overveje om jeg kan omstruktere lidt..

MANGE tak for hjælpen.. smid et svar :)
Avatar billede pidgeot Nybegynder
25. juni 2008 - 14:51 #7
Værsgo.

Du må gerne prøve at forklare hvad den SQL skal gøre - så kan det være jeg har en bedre ide.
Avatar billede teekay Nybegynder
25. juni 2008 - 15:05 #8
Har gjort den lidt mere simpel til spørgsmålet her, men kan godt prøve at forklare det.

Den henter nogle værdier ud fra tabellerne 'votes' og 'votesData'

- otes indeholder info om afstemning, så som overskrift og valgmuligheder.
- votesData indeholder info om hvem der har stemt hvad og på hvilken afstemning og dato

den SELECT COUNT(voteId) ... AS count er sådan at jeg kan _sortere_ efter hvilke afstemninger der har fået flest stemmer.

Og alt det her..
LEFT JOIN votesData ON votesData.userId = ".$_SESSION['userId']." AND votes.id = votesData.voteId WHERE votesData.userId IS NULL

Er for kun at få vist resultater hvor brugeren ikke allerede har afgivet en stemme

Hvis du har en ide til at omskrive forespørgslen må du meget gerne komme med den.. Er ik speciel god til joins og subqueries :)
Avatar billede pidgeot Nybegynder
25. juni 2008 - 15:17 #9
Med andre ord: Vis de afstemninger brugeren ikke har deltaget i, sorteret efter hvor mange der har stemt?

Jeg ved ikke om den bedre kan lide den (eller om det i det hele taget er bedre når det kommer til stykket), men du kan jo prøve det her (det er af gode grunde utestet):
SELECT votes.id, vd1.voteId, COUNT(voteId)
FROM votesData vd1 JOIN votes ON vd1.voteId = votes.id
WHERE NOT EXISTS(SELECT voteId FROM votesData vd2 WHERE vd2.userId = ".$_SESSION['userId']." AND vd2.voteId = vd1.voteId)
GROUP BY voteId
ORDER BY count DESC
Avatar billede nur0701 Nybegynder
25. juni 2008 - 21:21 #10
"Unsigned" betyder at "int" ikke begynder fra et negativt tal. F. eks. en "tinyint" går fra -128 til 127, men hvis den er "unsigned", ser den således ud: 0 til 255.

Men det lader ikke til at det er problemet.
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