25. juni 2008 - 12:48Der 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!?
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.
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.
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??)
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.
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 :)
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
"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.
Synes godt om
Ny brugerNybegynder
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.