Seite 1 von 2

MySQL-Anweisung

Verfasst: Di 21.Aug, 2007 23:09
von bce
habe eine tabelle mit 3 spalten (time, ip, text) alles vom typ varchar.
ziel ist mit einer sql-anweisung für die aktuelle ip mit dem höchsten timestamp den dazugehörigen text rauszubekommen...

bisher hatte ich 2 anweisungen nacheinander. aber man müßte die doch zu einer zusammenfassen können.
1. anweisung ermittelt den höchsten timestamp für die ermittelte ip

Code: Alles auswählen

$sql = "SELECT MAX(time) AS maxtime FROM tablexy WHERE remote = '" .$ip. "'";
...
$db_time = mysql_result($res, $i, 'maxtime');
(die ip wird vom skript ermittelt)

2. anweisung ermittelt vom gerade ermittelten timestamp den dazugehörigen text

Code: Alles auswählen

$sql = "SELECT text FROM tablexy WHERE time = '" .$db_time. "'";
...
$db_text = mysql_result($res, $i, 'text');
und das ganze nun in einer anweisung gepackt:

lokal funktioniert das ganze mit

Code: Alles auswählen

SELECT text FROM tablexy
WHERE time =
(SELECT MAX(time) FROM tablexy
WHERE remote = '" .$ip. "')";

lade ich das skript auf den server, so funktioniert es nicht mehr mit folgender fehlermeldung:
MySQL-Fehler: 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 'xxx.xxx.xxx.xx''' at line 1


info: unter phpinfo() zeigt es mir auf dem server
Client API version 5.0.21
und lokal
Client API version 3.23.49
an.

an was kanns liegen.. oder ist die zusammengefasste sql-anweisung grundlegend falsch?!

Verfasst: Di 21.Aug, 2007 23:48
von oxpus
Nimm anstelle IN das Gleichheitszeichen:

Code: Alles auswählen

SELECT text FROM tablexy
WHERE time =
(SELECT MAX(time) FROM tablexy
WHERE remote = '" .$ip. "')";
Bei IN erkennt die 5er Datenbank nicht mehr unbedingt, daß in der Klammer eine SQL-Anweisung steckt, gerade weil die Zeit als String gespeichert wird.
Wenn nur ein Text zurückkommen soll, wäre das so mit dem Gleichheitszeichen korrekt.
Ansonsten musst Du 2 getrennte Abfragen machen oder auch nur den ersten Text ausgeben, also noch ein "LIMIT 1" an die Abfrage anhängen.
IN klappt hier nur bei Zahlen einwandfrei...

Verfasst: Di 21.Aug, 2007 23:48
von AmigaLink
Versuch mal diesen Schnellschuss:

Code: Alles auswählen

"SELECT b.text FROM tableb b, tablea a
	WHERE b.time = MAX(a.time)
		AND a.remote = '" .$ip. "'";

Verfasst: Mi 22.Aug, 2007 11:11
von bce
AmigaLink hat geschrieben:Versuch mal diesen Schnellschuss:

Code: Alles auswählen

"SELECT b.text FROM tableb b, tablea a
	WHERE b.time = MAX(a.time)
		AND a.remote = '" .$ip. "'";
hab ja nur eine tabelle...

oxpus hat geschrieben:Ansonsten musst Du 2 getrennte Abfragen machen oder auch nur den ersten Text ausgeben, also noch ein "LIMIT 1" an die Abfrage anhängen.
das mit dem LIMIT funktioniert auch nicht. werd wohl die 2 abfragen hintereinander lassen müssen

Verfasst: Mi 22.Aug, 2007 11:14
von oxpus
hab ja nur eine tabelle...
Das hast Du falsch verstanden:
Man kann jede Tabelle in einer Abfrage auch mehrfach verwenden, muss diese allerdings mit einem Alias, hier hatte AmigaLink "a" und "b" verwendet, angeben, damit die Datenbank eben nicht durcheinander kommt.
Also dann auch bei allen Feldbezeichnungen den Aliasnamen mit angeben.
Und so sollte auch aus 2 eine Abfrage gemacht werden können.

*daran hatte ich zunächst auch garnicht gedacht*

Verfasst: Mi 22.Aug, 2007 11:24
von bce
aso :eek:

ok. hab das mal probiert:

Code: Alles auswählen

SELECT b.text FROM tablename b, tablename a 
   WHERE b.time = MAX(a.time) 
      AND a.remote = '127.0.0.1'
(für die ip hab ich mal die lokale test-ip eingesetzt, und zur besseren übersicht hab ich tablexy geändert in tablename)


bekomme aber nun auch lokal eine fehlermeldung:
SQL Ausführungsfehler 1111. Antwort der Datenbank:
Invalid use og group function

Verfasst: Mi 22.Aug, 2007 11:27
von oxpus
Dann vielleicht so:

Code: Alles auswählen

SELECT b.text FROM tablename b, tablename a 
   WHERE b.time = MAX(a.time) 
      AND a.remote = '127.0.0.1'
      GROUP BY b.text;
*störrischekleinedatenbank!*

Verfasst: Mi 22.Aug, 2007 11:31
von bce
danke dir für deine fixe hilfe. kommt aber immer noch die gleiche fehlermeldung

Verfasst: Mi 22.Aug, 2007 12:55
von oxpus
Okay...

Dann versuchs mal mit meinem Vorschlag aus Post #2...

Verfasst: Mi 22.Aug, 2007 14:00
von AmigaLink
Die Notwendige Gruppierung hab ich glatt vergessen. :(
Wie sieht es hiermit aus:

Code: Alles auswählen

SELECT b.text FROM tablename b, tablename a
    WHERE b.time = MAX(a.time)
       AND a.remote = '127.0.0.1'
    GROUP BY a.time;
Wenn es sich allerdings nur um eine Tabelle handelt, dann ist die Verwendung von Aliasen evtl. gar nicht nötig.

Verfasst: Mi 22.Aug, 2007 14:46
von oxpus
Wenn es sich allerdings nur um eine Tabelle handelt, dann ist die Verwendung von Aliasen evtl. gar nicht nötig
Doch, gerade dann, da sonst die Abfrage in sich selber laufen würde, was logisch falsch ist...

Verfasst: Mi 22.Aug, 2007 15:55
von AmigaLink
Kommt ganz darauf an. ;)

Wie wäre es hiermit:

Code: Alles auswählen

SELECT text FROM tablename
    WHERE remote = '127.0.0.1'
    ORDER BY time DESC
	LIMIT 1
:D

Verfasst: Mi 22.Aug, 2007 17:01
von oxpus
:hh:
Ja, klar, so ginge es auch...

Verfasst: Mi 22.Aug, 2007 17:34
von AmigaLink
Jaja, man kann sich auch von hinten durchs Ohr in den Kopf schießen. ;) :rofl:

Hätte bce von Anfang an gesagt das es sich um ein und dieselbe Tabelle handelt, dann hätte die Lösung auf der Hand gelegen. :)
So haben wir jetzt 10 mal um die Ecke gedacht und dabei das nächstliegendste übersehen.

Verfasst: Mi 22.Aug, 2007 22:16
von bce
danke jungs für euer bemühen! mit folgenden befehl funktioniert es! THX

Code: Alles auswählen

SELECT text FROM tablename 
    WHERE remote = '127.0.0.1' 
    ORDER BY time DESC 
   LIMIT 1
Amigalink hat geschrieben:Hätte bce von Anfang an gesagt das es sich um ein und dieselbe Tabelle handelt
^5 hab ich. gleich im ersten post, die ersten wörter:
habe eine tabelle mit 3 spalten ...

Verfasst: Do 23.Aug, 2007 00:00
von AmigaLink
Amigalink hat geschrieben:Hätte bce von Anfang an gesagt das es sich um ein und dieselbe Tabelle handelt
bce hat geschrieben:^5 hab ich. gleich im ersten post, die ersten wörter:
habe eine tabelle mit 3 spalten ...
Oh sorry, das hab ich (wir?) glatt übersehen und bin, aufgrund deines zusammenführ Ansatzes, von zwei Tabellen ausgegangen. ^6

Könnte auch ein wenig daran gelegen haben, das ich die Tage mehrere Stunden an einer SQL-Abfrage gearbeitet habe. Irgendwann hab ich angefangen zu Googeln und Glücklicherweise ein paar Lösungen gefunden. Ich hab dann nochmal eine Stunde gebraucht um die Lösungen an meine Bedürfnisse anzupassen und zu ermitteln welche der (3) Lösungswege der schnellste ist. ^1

Verfasst: Do 23.Aug, 2007 00:12
von oxpus
Mach mal Pause ;)

Verfasst: Do 23.Aug, 2007 01:18
von AmigaLink
Mach mal Pause
Hab ich heute gemacht. :D
Und gestern hab ich auch nicht Programmiert, sondern mich mit meiner Buchführung beschäftigt. :)

// EDIT
Das ist übrigens die Abfrage:

Code: Alles auswählen

"SELECT IF(a.cat_id IS NULL,0,COUNT(*)) AS 'article', b.cat_id, b.categorie
				FROM " . KB_CAT . " b
				LEFT JOIN " . ARTICLE_TABLE . " a ON b.cat_id=a.cat_id
				GROUP BY b.cat_id
				ORDER BY b.categorie ASC";

Verfasst: Do 23.Aug, 2007 12:18
von oxpus
Ja und? *duck*

Verfasst: Do 23.Aug, 2007 13:50
von AmigaLink
BildBild

Verfasst: Do 23.Aug, 2007 14:17
von oxpus
Bild

Verfasst: Do 23.Aug, 2007 15:34
von AmigaLink
^6

Verfasst: Do 23.Aug, 2007 22:41
von bce
[quote="AmigaLink";p="76081"]

Code: Alles auswählen

"SELECT IF(a.cat_id IS NULL,0,COUNT(*)) AS 'article', b.cat_id, b.categorie
				FROM " . KB_CAT . " b
				LEFT JOIN " . ARTICLE_TABLE . " a ON b.cat_id=a.cat_id
				GROUP BY b.cat_id
				ORDER BY b.categorie ASC";
[/quote]
:eek:
hast du sonst noch andere hobbys!? hui
^a

Verfasst: Fr 24.Aug, 2007 06:43
von oxpus
Die ist doch noch simple.
An der Arbeit erstelle ich SQL-Anweisungen über dutzende von Tabellen und Views mit ettlichen Parametern und Gruppierungen sowie UNIONs.
Die sind dann mehrere Seiten lang, aber okay, dafür habe ich auch ein Tool, daß mir bei der Erstellung hilft ;)

Verfasst: Fr 24.Aug, 2007 12:09
von Christian_N
Wärst vllt. auch so lieb und könntest mal sagen welches? :)

Den mit den SQL-Anweisungen hab ich noch so meine Probleme. :D

Kann das Tool dann auch so wie des Miro2 von Cback die Installations-Anleitung herstellt so db_install.php bzw. db_update.php herstellen?

Oder wie stellst du für deine MOD her? Da gibt es bestimmt auch eine Hilfe-Tool wie es für die MOD-Anleitungen es ja gibt.

Gruß Chris