30. november 2004 - 21:54Der er
14 kommentarer og 1 løsning
slet hvis det er NULL
jeg har en query, og hvis points er NULL skal den slette en række i en table... men det sker bare ikke?
$exceed_time = $TIME - (60 * 60 * 24 * 30);
$sql = "SELECT track.*, SUM(user_top5.points) AS points FROM ($DB.eb_track track LEFT JOIN $DB.eb_user_top5 user_top5 ON track.id=user_top5.track_id) LEFT JOIN $DB.eb_hitlist hitlist ON track.id=hitlist.track_id WHERE user_top5.time>$exceed_time GROUP BY track.id"; $get = mysql_query($sql); while($row = mysql_fetch_array($get)) { if($row['points']) { // gør noget } else mysql_query("DELETE FROM $DB.eb_track WHERE id=$row[id]"); }
dsj: det er ikke korrekt. I PHP v. 4 og frem fungerer sammenligning med NULL helt fint.
Bortset fra det, vil jeg da anbefale dsj's løsning for at slette posterne - ikke fordi den oprindelige løsning er forkert, men fordi det er trist at fyre en masse queries af for at slette een post af gangen frem for at gøre det i eet hug.
det er vist ikke der min fejl ligger? den udtrækker kun de rækker hvor points er lig noget... hvordan kan det være at den ikke tager alle rækker fra eb_track? jeg har jo lavet en LEFT JOIN... :(
mysql_query("DELETE FROM $DB.eb_track WHERE points IS NULL");
...er der tale om en sammenligning i MySQL og ikke i PHP. "WHERE points IS NULL" gennemføres af MySQL, og ved "WHERE points = NULL" vil MySQL (også > v.4) ikke returnere nogen rækker hvor points er lig NULL - IS NULL _skal_ anvendes.
... $get = mysql_query($sql); while($row = mysql_fetch_array($get)) { if($row['points']) { // gør noget } } mysql_query("DELETE FROM $DB.eb_track WHERE id IS NULL");
kommentaren 02/12-2004 15:13:22 var i øvrigt møntet til majkat, og ikke supermand69, min fejl.
Det jeg i mit forslag har valgt at gøre er, at flytte sammenligningen af rækker hvor points er lig NULL fra PHP'en til databasen, hvilket performancemæssigt er mere effektivt, og måske sparer lidt kode i PHP'en.
Hvis man i PHP'en sammenligner hver enkelt række for points lig NULL, og én efter én sletter rækker hvor points er lig null, vil sletningen kræve n DELETE-statements. Hvis man derimod kører ét DELETE-statement der gennemfører sammenligningen i databasen, vil det give en performanceforbedring, så længer der slettes mere end én række i tabellen.
Nu jeg lige har kigget grundigere på dit statement, supermand69, ser jeg, at 'points' jo ikke er en kolonne, men en sum af en points-kolonne. Hvis du summer et antal rækker, hvor user_top5.points alle er NULL, vil summen give 0.
En lille undskydelse: Dette er en lille uvane MySQL har i forhold til f.eks. MS SQL, hvor summen af rækker med udelukkende NULL-felter vil give NULL.
supermand, lige for at være sikker, når du skriver: "hvis points er NULL skal den slette en række" tænker du så på SUM(user_top5.points), eller på user_top5.points?
Hvis førstnævnte er tilfældet, vil $row['points'] === NULL returnere false, fordi $row['points'] == 0.
ja, hvis summen ikke er noget vil jeg slette rækken fra tracks
hvis jeg smider følgende query i phpmyadmin får jeg alle rækker med (179): --- SELECT track.*, SUM(user_top5.points) AS points FROM ($DB.eb_track track LEFT JOIN $DB.eb_user_top5 user_top5 ON track.id=user_top5.track_id) LEFT JOIN $DB.eb_hitlist hitlist ON track.id=hitlist.track_id GROUP BY track.id
men hvis jeg gør således får jeg kun trukket dem ud hvor points er noget: --- $sql = "SELECT track.*, SUM(user_top5.points) AS points FROM ($DB.eb_track track LEFT JOIN $DB.eb_user_top5 user_top5 ON track.id=user_top5.track_id) LEFT JOIN $DB.eb_hitlist hitlist ON track.id=hitlist.track_id WHERE user_top5.time>$exceed_time GROUP BY track.id"; $get = mysql_query($sql); echo mysql_num_rows($get).'<br><br>'; while($row = mysql_fetch_array($get)) { echo $row['id'].' - '.$row['points'].'<br>'; }
dsj>> kommentaren 02/12-2004 15:13:22 var i øvrigt møntet til majkat, og ikke supermand69, min fejl.
Vi talte forbi hinanden. Du skrev at man ikke kunne sammenligne m. "=" - og det eneste sted supermand69 gør det, er i PHP koden. Jeg nåede ikke lige at fange resten af din kommentar - beklager.
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.