Avatar billede aggie Nybegynder
31. maj 2001 - 04:12 Der er 8 kommentarer og
1 løsning

DELETE FROM t WHERE x IN SELECT ( y )

Kan jeg ikke med mySQL gøre

DELETE FROM Priority WHERE picture_id IN SELECT (id  FROM Picture WHERE category = \'{$id}\')

den siger fejl ved \'SELECT..
Avatar billede tpiil Nybegynder
31. maj 2001 - 05:24 #1
der sker ikke meget på eksperten på denne tid :)

jeg forstår ikke helt din SQL, hvilken tabel er det du vil slette noget i og hvad er det den skal gøre??
Avatar billede erikjacobsen Ekspert
31. maj 2001 - 06:31 #2
Mysql forstår da vist ikke subselect - du bliver nok nødt til at lave en
løkke i dit program, og lave en masse \"delete from ...\"
Avatar billede limemedia Nybegynder
31. maj 2001 - 11:12 #3
Prøv følgende php script... Hastighedsforskellen vil være minimal med den hastighed mySQL foretager simple select statements. Så du burde kunne anvende nedenstående for at løse problemet

<php
    $sql = mysql_query(\"SELECT id FROM Picture WHERE Category=\'{$id}\'\");
    $first = true;
    if (mysql_num_rows($sql)) {
        while ($foo = mysql_fetch_array($sql)) {
            if ($first) {
                $res = $foo[\"id\"];
                $first = false;
            } else {
                $res .= \",\".$foo[\"id\"];
            }
        }
        $deletesql = mysql_query(\"DELETE FROM Priority WHERE picture_id IN ($res)\");
    }
?>

ikke testet...

ps. jeg går ud fra at du bruger det til et php script. ellers kan du oversætte semantikken til et andet sprog ...
Avatar billede erikjacobsen Ekspert
31. maj 2001 - 12:06 #4
Det er rigtigt ljweb, med én select og én delete, er der reelt ikke forskel i hastighed.
Min første tanke var mange delete-r. MySql er iøvrigt så smart, at den sorterer
tallene i IN-konstruktionen, og så laver en binær søgning (eller noget smartere hvis
der er index på).
Avatar billede aggie Nybegynder
01. juni 2001 - 09:14 #5
nej, det er da rigtigt - ingen subselects...
Avatar billede aggie Nybegynder
01. juni 2001 - 09:17 #6
nej, det er sq da rigtigt, ingen subselects - jeg har en bog der påstår at det meste kan gøres som left joins istedet, men jeg har svært ved at se en join mellem select og delete...

takker for den simple men effektive løsning - jeg var igang med noget med at delete enkeltvis - det kunne min server ikke lide :)
Avatar billede limemedia Nybegynder
01. juni 2001 - 10:51 #7
aggie >> jeg har leget med leftjoins i nogle store og tunge queries og min erfaring viser at det utroligt ofte er *langt* hurtigere at fyre to select sætninger af...
Avatar billede aggie Nybegynder
01. juni 2001 - 11:00 #8
tjaa, jeg har ranet en timer class fra et eller andet web sted, og agter at sætte mig ned med en ordentlig stor database og få nogle ordentlige tal på det her, ikke fordi jeg har vildt mange transaktioner, men selv med 5 simultane conenctions tager nogle joins over 5 sekunder at returnere, og så tør jeg ikke gætte på hvad der skete hvis det var mig der havde programmeret eksperten :)

Kan du i øvrigt sige mig hvorfor

DELETE FROM Priority WHERE picture_id = {$id};
DELETE FROM Picture WHERE id = {$id};

ikke kan skrives

DELETE FROM Priority,Picture WHERE Priority.picture_id = {$id} OR Picture.id = {$id}

? er det mig der ikke fatter en skid af OR eller?
Avatar billede erikjacobsen Ekspert
01. juni 2001 - 12:20 #9
Fordi du ikke kan have 2 tabelnavne i en delete.

Du skal passe på at det du joiner på er indexeret i begge tabeller - ellers
tager det tid
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