Avatar billede peturkirke Novice
02. juni 2003 - 17:59 Der er 19 kommentarer og
1 løsning

ORDER BY forstyrrer

Jeg prøver at slette de ældste poster fra en tabel, og bruger denne sql-sætning:

DELETE FROM tabelnavn ORDER BY Tid ASC, ID ASC LIMIT 7;

Jeg får dette ikke til at fungere, men det fungerer fint, når jeg fjerner ORDER BY syntaksen.
Hvad skyldes dette ?
Tid er et timestampfelt, og ID er mediumint
Avatar billede peturkirke Novice
02. juni 2003 - 18:04 #1
hvordan forhøjer jeg pointene ?
Avatar billede peturkirke Novice
02. juni 2003 - 18:04 #2
sådan
Avatar billede fsconsult.dk Nybegynder
02. juni 2003 - 18:11 #3
ORDER BY kan ikke bruges i INSERT/UPDATE/DELETE men kun i SELECT statements.

Du skal bruge noget i retning af "DELETE FROM tabelnavn WHERE TO_DAYS(NOW()) - TO_DAYS(tid) > 7;"

Hvilket burde slette records hvor tid er mere end 7 dage gammelt.
Avatar billede cskaade Nybegynder
02. juni 2003 - 18:12 #4
jeg mener at ORDER BY skal stå til sidst prøve det
Avatar billede fri-hash Nybegynder
02. juni 2003 - 18:16 #5
ORDER BY kan _godt_ bruges i en delete(i Mysql efter version 4.0), men der skal vist være en WHERE-klausul, ifølge http://www.mysql.com/doc/en/DELETE.html

"If an ORDER BY clause is used (available from MySQL 4.0.0), the rows will be deleted in that order. This is really only useful in conjunction with LIMIT. For example:

DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp
LIMIT 1

This will delete the oldest entry (by timestamp) where the row matches the WHERE clause. "


dvs dette burde virke hvis din mysql er nyere end 4.0

DELETE FROM tabelnavn WHERE (1) ORDER BY Tid ASC, ID ASC LIMIT 7;
Avatar billede roo104 Nybegynder
02. juni 2003 - 23:15 #6
Prøv med
DELETE FROM tabelnavn WHERE (SELECT * FROM tabelnavn ORDER BY Tid ASC, ID ASC LIMIT 7);
Avatar billede peturkirke Novice
03. juni 2003 - 10:16 #7
Jeg har version 3, et eller andet, dvs ikke version 4.
til roo104: din sql fungerer heller ikke !
Avatar billede roe Nybegynder
03. juni 2003 - 10:43 #8
Brug nu en WHERE Clause til det du vil og ikke en ORDER BY! Det er mere korrekt at gøre sådan!
Avatar billede peturkirke Novice
03. juni 2003 - 10:47 #9
jamen det er lidt svært fordi jeg skal slette et bestemt antal records.
Jeg skal konstant kun have de nyeste 10 records tilbage.
Derfor ville LIMIT og ORDER BY være perfekt at bruge.
Avatar billede fri-hash Nybegynder
03. juni 2003 - 10:53 #10
er det noget du gør fra et script? (asp, php el lign)
hvis du gør, og når du har version 3 (der som nævnt ovenfor ikke understøtter ORDER BY i DELETE-statements) kan du istedet hente de relevante ID'er med

SELECT ID FROM tabelnavn ORDER BY Tid ASC, ID ASC LIMIT 7;

og derefter

DELETE FROM tabelnavn WHERE ID=xx OR ID=yy OR... osv. med de ID'er der blev hentet ...
Avatar billede peturkirke Novice
03. juni 2003 - 11:48 #11
ja jeg bruger php
du er genial - man skulle ikke tro, du havde røget så meget hash
skriv igen, så jeg kan give dig poengene
Avatar billede zapzap Nybegynder
03. juni 2003 - 11:50 #12
Måske en kombi:
DELETE FROM tabelnavn WHERE ID in (SELECT ID FROM tabelnavn ORDER BY Tid ASC, ID ASC LIMIT 7);
Avatar billede peturkirke Novice
03. juni 2003 - 11:51 #13
zapzap - læs længere oppe
Avatar billede zapzap Nybegynder
03. juni 2003 - 12:13 #14
Jeg kombinerer de to ting i hash'es svar - prøver ikke at lave noget af det ovenfor, så vidt jeg kan se.
Avatar billede peturkirke Novice
03. juni 2003 - 12:23 #15
ja undskyld
men den sætning kører heller ikke
Avatar billede zapzap Nybegynder
03. juni 2003 - 12:25 #16
Kører ikke - altså sletter ikke det rigtige?
Avatar billede fri-hash Nybegynder
03. juni 2003 - 12:55 #17
et svar, hvis du kunne bruge forslaget ;-)
Avatar billede peturkirke Novice
03. juni 2003 - 13:00 #18
zapzap: sætningen melder en fejl, hvor SELECT begynder. Så jeg ved ikke om den er lovlig ?
hasheren: ideen er jo fin nok, men jeg har endnu ikke fået det til at fungere. Er ikke god til C / PHP syntaks
Avatar billede fri-hash Nybegynder
03. juni 2003 - 13:22 #19
jup, prøv dette (tilret naturligvis tabelnavn til det din tabel hedder)



//connect til database

$selectSQL = "SELECT ID, Tid FROM tabelnavn ORDER BY Tid ASC, ID ASC LIMIT 7";
$res = mysql_query($selectSQL) or die(mysql_error());

// luk DB connection

$delete_ids = array();
while($row = mysql_fetch_array($res)){
  $delete_ids[] = $row["ID"];
}

// $delete_ids er nu et array, indeholdende de ID'er der skal slettes

$deleteSQL = "DELETE FROM tabelnavn WHERE ";
for($i=0; $i<sizeof($delete_ids)-1; $i++){
  $deleteSQL .= "ID=". $delete_ids[$i] ." OR ";
}
$deleteSQL .= "ID=". $delete_ids[$i];

//connect database

$res = mysql_query($deleteSQL) or die(mysql_error());
Avatar billede peturkirke Novice
03. juni 2003 - 14:56 #20
det fungerer fint
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