MySQL-Anweisung

PHP, Ajax, CSS, HTML, Javascript
Eben für die wirklich Harten, die alles selber machen.
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

MySQL-Anweisung

Beitrag 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?!
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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...
Zuletzt geändert von oxpus am Di 21.Aug, 2007 23:48, insgesamt 1-mal geändert.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag 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. "'";
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag 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
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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*
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag 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
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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!*
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag von bce »

danke dir für deine fixe hilfe. kommt aber immer noch die gleiche fehlermeldung
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Okay...

Dann versuchs mal mit meinem Vorschlag aus Post #2...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag 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.
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag 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
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

:hh:
Ja, klar, so ginge es auch...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag 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.
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag 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 ...
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag 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
Zuletzt geändert von AmigaLink am Do 23.Aug, 2007 01:18, insgesamt 1-mal geändert.
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Mach mal Pause ;)
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag 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";
Zuletzt geändert von AmigaLink am Do 23.Aug, 2007 01:25, insgesamt 1-mal geändert.
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Ja und? *duck*
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

BildBild
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Bild
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
AmigaLink
Beiträge: 5843
Registriert: Mi 03.Mär, 2004 09:05
Wohnort: NRW
Kontaktdaten:

Beitrag von AmigaLink »

^6
[center].: Web Relax .::. Essen mit Freude .::. AmigaLink.de :.
______________________________________

Kein Support per PM, ICQ oder eMail!!!
[/center]
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag 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
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag 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 ;)
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Christian_N
Beiträge: 1787
Registriert: Sa 19.Feb, 2005 21:48
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitrag 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
Meine Projekte: Chantals - Fanpage .::. phpBB Projekt
Antworten