Avatar billede supermand69 Nybegynder
30. november 2004 - 21:54 Der 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]");
    }
Avatar billede detox Nybegynder
30. november 2004 - 22:42 #1
Du skal nok bruge:

if($row['points'] === NULL)
Avatar billede detox Nybegynder
30. november 2004 - 22:45 #2
Altså:

    while($row = mysql_fetch_array($get))
    {
        if($row['points'] === NULL)
        {
                mysql_query("DELETE FROM $DB.eb_track WHERE id=$row[id]");
        }
        else  // gør noget
    }
Avatar billede dsj Nybegynder
30. november 2004 - 23:15 #3
Når du sammenligner med værdien NULL kan du ikke bruge det normale lighedstegn, men skal i stedet bruge 'IS', som i følgende eksempel:

mysql_query("DELETE FROM $DB.eb_track WHERE points IS NULL");
Avatar billede majkat Nybegynder
01. december 2004 - 08:10 #4
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.
Avatar billede supermand69 Nybegynder
01. december 2004 - 20:53 #5
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... :(
Avatar billede supermand69 Nybegynder
02. december 2004 - 15:05 #6
detox > jeg synes ikke det virker?
Avatar billede detox Nybegynder
02. december 2004 - 15:09 #7
Ok, jeg kan heller ikke lige overskue din forespørgsel. Hvad med at prøve dsj's forslag?
Avatar billede dsj Nybegynder
02. december 2004 - 15:13 #8
supermand69 >> I følgende statement:

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.
Avatar billede dsj Nybegynder
02. december 2004 - 15:16 #9
Du bør skrive den samlede kode som følger:

    ...
    $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");
Avatar billede dsj Nybegynder
02. december 2004 - 15:30 #10
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.
Avatar billede dsj Nybegynder
02. december 2004 - 16:00 #11
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.
Avatar billede supermand69 Nybegynder
02. december 2004 - 16:17 #12
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>';
}
Avatar billede majkat Nybegynder
02. december 2004 - 21:34 #13
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.
Avatar billede dsj Nybegynder
03. december 2004 - 10:21 #14
Fint fint, jeg bare have forklaret mig grundigt nok fra starten af :-)
Avatar billede supermand69 Nybegynder
03. december 2004 - 13:34 #15
lukker
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