Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Was ist an diesem (Sub)query falsch? (https://www.delphipraxis.net/92108-ist-diesem-sub-query-falsch.html)

Namenloser 14. Mai 2007 18:00

Datenbank: MySQL • Version: 4.1 • Zugriff über: PHP

Was ist an diesem (Sub)query falsch?
 
Hallo, Community!
Ich hab auch mal wieder ein Problem, diesmal aber nicht in Delphi.

Und zwar beschäftige ich mich jetzt seit kurzem mit MySQL und brauche jetzt ein Subquery.
Im Prinzip geht es darum, dass ich eine Tabelle habe, in der maximal 20 Reihen stehen sollen.

Ich dachte, das würde mit diesem Query gehen, tut es aber nicht (Fehler gibt es keinen):
Code:
SELECT * FROM gb_verificationid WHERE id <(SELECT MAX(id)-20)
Zur Erklärung: ID ist ein AutoInc-Wert.

Hab schon Google und alles gequält aber nichts hilfreiches gefunden (In meinem Buch sind Subqueries leider ziemlich schlecht erklärt).

Ich hoffe, mir kann jemand helfen!


edit: das erste select sollte eigentlich ein delete sein...

mkinzler 14. Mai 2007 18:02

Re: Was ist an diesem (Sub)query falsch?
 
SQL-Code:
SELECT v1.* FROM gb_verificationid v1, gb_verificationid v1 WHERE v1.id < (MAX(v2.id)-20);

Der_Unwissende 14. Mai 2007 18:06

Re: Was ist an diesem (Sub)query falsch?
 
Oder auch

SQL-Code:
SELECT * FROM gb_verificationid WHERE id <(SELECT MAX(id)-20 FROM gb_verificationid)
(ggf. in Delete ändern sollte nicht das Problem sein)

Gruß Der Unwissende

Namenloser 14. Mai 2007 18:09

Re: Was ist an diesem (Sub)query falsch?
 
@mkinzler:
danke, aber leider funktioniert das nicht (#1066 - Not unique table/alias: 'v1' ). Außerdem muss ich mich korrigieren, eigentlich hätte es
Code:
DELETE * FROM gb_verificationid WHERE id <(SELECT MAX(id)-20)
heißen müssen.

@der_unwissende:
der code funktioniert besser, aber der code wird komischerweise so ausgewertet, als ob es SELECT * FROM gb_verificationid WHERE id =(SELECT MAX(id)-20 FROM gb_verificationid) geheißen hätte.

mkinzler 14. Mai 2007 18:11

Re: Was ist an diesem (Sub)query falsch?
 
das Problem beim Copy&Paste ist, daß man oft vergißt das eingefügte zu verändern:
SQL-Code:
SELECT v1.* FROM gb_verificationid v1, gb_verificationid v2 WHERE v1.id < (MAX(v2.id)-20);

Namenloser 14. Mai 2007 18:20

Re: Was ist an diesem (Sub)query falsch?
 
Wenn ich den Code so nehme wir er da steht bekomme ich "#1111 - Invalid use of group function"
Muss ich daran noch etwas ändern? Wenn ja, was?

Tut mir Leid, ich steig durch Subqueries einfach nicht durch :cry:

hoika 14. Mai 2007 20:03

Re: Was ist an diesem (Sub)query falsch?
 
Hallo,

SELECT * FROM gb_verificationid WHERE id <(SELECT MAX(id)-20)

hier fehlt was.
du musst in dem SubSelect schon
eine komplette Abfrage schreiben
Bei dir fehlt das From

Ausserdem würde ich mit Table-Alias arbeiten (gb1 und gb2)

SQL-Code:
SELECT gb1.* FROM gb_verificationid gb1 WHERE gb1.id <
(SELECT MAX(gb2.id)-20  FROM gb_verificationid gb2)

Heiko

Namenloser 14. Mai 2007 20:42

Re: Was ist an diesem (Sub)query falsch?
 
Vielen dank schon mal, der Code funktioniert fürs select wunderbar. Aber leider lässt sich das select wohl nicht einfach durch delete austauschen: "1093 - You can't specify target table 'gb_verificationid' for update in FROM clause "

Warum muss das bloß so kompliziert sein...

omata 14. Mai 2007 21:31

Re: Was ist an diesem (Sub)query falsch?
 
Lass doch mal den Prefix weg...

SQL-Code:
DELETE FROM gb_verificationid
WHERE id < (SELECT MAX(id) - 20 
            FROM gb_verificationid)
Gruss
Thorsten

Namenloser 14. Mai 2007 21:34

Re: Was ist an diesem (Sub)query falsch?
 
Da passiert leider das gleiche. Aber langsam frage ich mich, ob das bisschen performance so viel mühe überhaupt wert ist, schließlich hat es ohne subquery mit zwei einzelabfragen auch geklappt.

hoika 15. Mai 2007 08:20

Re: Was ist an diesem (Sub)query falsch?
 
Hallo,

zeig doch noch mal dein Delete mit Subquery.
Es kann auch sein, dass mysql das noch nicht im delete kann.
Subqueries sind ja auch erst mit der 4er(oder 4.er ?) Version eingeführt worden.


Heiko

Namenloser 15. Mai 2007 15:21

Re: Was ist an diesem (Sub)query falsch?
 
Das query ist dieses hier:
Zitat:

Zitat von omata
Lass doch mal den Prefix weg...

SQL-Code:
DELETE FROM gb_verificationid
WHERE id < (SELECT MAX(id) - 20 
            FROM gb_verificationid)
Gruss
Thorsten

Ich habe MySQL4.1 installiert, das müsste eigentlich gehen.

hoika 15. Mai 2007 15:28

Re: Was ist an diesem (Sub)query falsch?
 
Hallo,

kann so nicht gehen.
Du benutzt die gleiche Tabelle und deren Feld Id
zweimal. Da muss man dann Tabellen-Aliase benutzen.
Das SubSelect könnte ja auch eine völlig andere Tabelle sein.


SQL-Code:
DELETE FROM gb_verificationid gb1
WHERE gb1.id < (SELECT MAX(gb2.id) - 20
            FROM gb_verificationid gb2)

Heiko

Namenloser 15. Mai 2007 17:16

Re: Was ist an diesem (Sub)query falsch?
 
das funktioniert leider auch nicht, da stimmt wohl die syntax nicht :( . "#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE gb1.id < (SELECT MAX(gb2.id) - 20
FROM gb_verificationid gb2)' at line 2
"

marabu 15. Mai 2007 17:34

Re: Was ist an diesem (Sub)query falsch?
 
Hallo,

das gesuchte Statement in der Syntax von MySQL ab Version 4.0.2 sieht so aus:

SQL-Code:
DELETE FROM gb_verificationid t1 
USING t1, gb_verificationid t2 
WHERE t2.id < (SELECT MAX(id) - 20 FROM t2)
Grüße vom marabu

Namenloser 15. Mai 2007 18:46

Re: Was ist an diesem (Sub)query falsch?
 
dankeschön, aber das klappt leider auch nicht :(
Angeblich existiert <datenbankname>.1 nicht. Tut es aber...

omata 15. Mai 2007 19:19

Re: Was ist an diesem (Sub)query falsch?
 
Zitat:

Zitat von hoika
...kann so nicht gehen.
Du benutzt die gleiche Tabelle und deren Feld Id
zweimal. Da muss man dann Tabellen-Aliase benutzen.
Das SubSelect könnte ja auch eine völlig andere Tabelle sein.

Kann es nicht!
Beides sind völlig getrennte Namensräume und dabei gilt: lokal geht immer vor global.
Also die Aussage kann so nicht gehen kann nicht stimmen. Das Problem scheint ein anderes zu sein.

@NamenLozer: Kannst du nicht mal MySQL5 benutzen? Oder ist das ein Webserver an dem du die Version nicht verändern kannst?

Edit: Habe das gerade selber mal mit MySQL5 ausprobiert. Das scheint wirklich nicht zu gehen. Das finde ich sehr schade. Man kann scheinbar die zu verändernde Tabelle nicht nochmal in einer SubQuery der gleichen Abfrage aufführen. Schade, ich fand MySQL mal richtig gut.

Gruss
Thorsten

marabu 15. Mai 2007 20:07

Re: Was ist an diesem (Sub)query falsch?
 
Hallo,

Zitat:

Zitat von NamenLozer
dankeschön, aber das klappt leider auch nicht

nur damit kein falscher Eindruck entsteht: Es klappt vielleicht bei dir nicht.

Meine Tests unter MySQL 4.0.5 hat das Statement erfolgreich absolviert.

Freundliche Grüße

Namenloser 15. Mai 2007 21:45

Re: Was ist an diesem (Sub)query falsch?
 
Dann muss sich da wohl was geändert haben zwischen 4.0 und 4.1. Schade. Naja, dann werd ichs halt mit zwei Queries machen, funktioniert ja auch.

Trotzdem Danke an alle, die versucht haben, mir zu helfen!

(wenn jemand trotzdem noch eine idee hat, wie's gehen könnte, darf er es natürlich gerne sagen ;) )

marabu 15. Mai 2007 21:56

Re: Was ist an diesem (Sub)query falsch?
 
Hallo,

die Syntax DELETE USING wird ab MySQL Version 4.0.2 bis hin zur aktuellen Version unterstützt. Du musst langsam anfangen den Fehler bei deiner Umsetzung zu suchen - oder du verwendest deine Umgehungslösung.

Gute Nacht

Namenloser 16. Mai 2007 15:53

Re: Was ist an diesem (Sub)query falsch?
 
Hallo marabu,
Zitat:

Zitat von marabu
Du musst langsam anfangen den Fehler bei deiner Umsetzung zu suchen - oder du verwendest deine Umgehungslösung.

Daran kann es eigentlich nicht liegen, da ich die statements im phpmyadmin getestet habe.

stifflersmom 16. Mai 2007 16:48

Re: Was ist an diesem (Sub)query falsch?
 
benutz doch einfach das mysql-Gimick: limit


Also:

SQL-Code:
select * from gb_verificationid
order by id desc limit 20
Moin

marabu 16. Mai 2007 17:44

Re: Was ist an diesem (Sub)query falsch?
 
Hallo,

das sieht für mich so aus, als ob du die "letzten" 20 gespeicherten Datensätze selektieren möchtest. Ich hatte das Problem bisher so verstanden, dass alle Datensätze bis auf diese (ungefähr) 20 gelöscht werden sollen.

Getestet hatte ich übrigens mit dem MySQL Query Browser. Vielleicht verhindert phpmyadmin die erfolgreiche Verarbeitung des Statements?

Freundliche Grüße

Namenloser 16. Mai 2007 17:59

Re: Was ist an diesem (Sub)query falsch?
 
Hi,
Zitat:

Zitat von marabu
Ich hatte das Problem bisher so verstanden, dass alle Datensätze bis auf diese (ungefähr) 20 gelöscht werden sollen.

Dann hast du es auch richtig verstanden ;)
Ich habe auf meiner Seite ein Gästebuch. Bei jedem Gästebuchbesuch wird zum Schutz vor Spam eine VID (=verificationid) generiert, der eine bestimmtes Frage-Antwortpaar zugeordnet ist. Damit die Datenbank aber nicht so zugemüllt wird, sollen maximal 20 datensätze darin enthalten sein. (Bei Bedarf kann man das ja noch auf 100 ausweiten...)

@stifflersmom: Funktioniert das denn auch bei Delete? Wenn ja, wär das genau das, was ich brauche!
edit: achnee, warte mal, das würde ja genau die datensätze löschen, die ich NICHT löschen will...

stifflersmom 16. Mai 2007 19:46

Re: Was ist an diesem (Sub)query falsch?
 
Ok, wenn Du löschen willst, dann mach es so

SQL-Code:
select @lid := LAST_INSERT_ID(id) from gb_verificationid order by id desc limit 1;
delete from gb_verificationid where id < @lid-20;
Befor Du löscht, solltest Du erst noch mal mit Select testen...

Moin

Namenloser 16. Mai 2007 20:13

Re: Was ist an diesem (Sub)query falsch?
 
JUHUU! :hello:
Es funktioniert :party:

Vielen Dank (auch an alle anderen!)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz