Seite 1 von 1

MySQL: Probleme mit JOINs

Verfasst: 06.11.2005, 15:33
von Daniela
Hallo,

ich habe hier ein kleines Problem. Meine MySQL-Kenntnisse sind eher schwach, deshalb bitte nicht wegen jedem kleinen Fehler runtermachen.

Ich habe 2 Tabellen:

- Tabelle "hosts" mit Feldern "id" (INT) und "hostname" (VARCHAR)
- Tabelle "pings" mit Feldern "id" (INT), "h_id" (INT) und "online" (ENUM(0,1))

"h_id" bezieht sich auf die "hosts.id"

Nun möchte ich alle hostnames die entweder online = 0 sind oder in der pings-Tabelle noch gar keinen Eintrag haben.

Probiert habe ich es folgendermaßen:

Code: Alles auswählen

SELECT * FROM hosts LEFT JOIN pings ON hosts.id = pings.id WHERE pings.online = '0' OR pings.online = NULL
Da bekomme ich jedoch nur die Datensätze zurück die online = 0 sind - die bei denen in der pings-Tabelle gar nichts vorhanden ist fehlen.

Bitte helft mir auf die Sprünge...

Dankeschön, Daniela

Verfasst:
von

Verfasst: 06.11.2005, 16:22
von Fox Mulder
Da ich Join eigentlich nie nutze würde ich es so machen:
SELECT * FROM hosts, pings WHERE (pings.online = '0' OR pings.online = NULL) AND hosts.id = pings.id
Gruss

Verfasst: 06.11.2005, 16:38
von net(t)worker
Fox Mulder hat geschrieben:Da ich Join eigentlich nie nutze würde ich es so machen:
SELECT * FROM hosts, pings WHERE (pings.online = '0' OR pings.online = NULL) AND hosts.id = pings.id
Gruss
:D auch das ist ein Join....

MySQL: Probleme mit JOINs

Verfasst: 06.11.2005, 16:44
von Daniela
Ein sogenannter EQUI-JOIN wäre das ja. Funktioniert aber nur wenn jeder hosts.id ein pings.h_id entspricht - und das ist ja eben NICHT der Fall. Es kann sein dass es in pings gar keine Zeile gibt mit der passenden id. Deshalb auch der LEFT JOIN - da wird die Tabelle rechts mit NULL aufgefüllt. Nur weiss ich nciht wie ich darauf dann auswähle...

Also nochmal um das klar zu machen:
Nicht jeder Eintrag in der "hosts"-Tabelle hat einen passenden Eintrag in der "pings"-Tabelle. Aber genau von diesen Einträgen (und bei denen pings.online = 0) brauche ich die ID.

Verfasst: 06.11.2005, 18:08
von magadoo
Spontan fällt mir das ein:

Code: Alles auswählen

SELECT * FROM hosts LEFT JOIN pings ON hosts.id = pings.h_id WHERE pings.online = '0' OR pings.id is NULL

MySQL: Probleme mit JOINs

Verfasst: 06.11.2005, 18:18
von Daniela
Call me Supermega-Depp. :bad-words:

"is NULL" statt "= NULL" muss es natürlich heißen - und schon funktioniert es.

AHHHHHH &§$&§&%$ &% &% §&% &%§$ &%$

Danke!

MySQL: Probleme mit JOINs

Verfasst: 06.11.2005, 18:25
von Daniela
Damit aber gleich zum nächsten Problem:

In der Tabelle "pings" gibt es noch ein Feld "timestamp" in dem eben der Timestamp der letzten Abfrage gespeichert wird. Nun kann es zu einer hosts.id mehrere Einträge in der "pings"-Tabelle geben.

Wie bekomme ich nur jeweils die Zeile mit dem neuesten Tiemstamp?

MySQL: Probleme mit JOINs

Verfasst: 06.11.2005, 18:39
von magadoo
@ Supermega-Depp

Nein :lol:

@ Daniela

Evtl. mit der "Group By"-Klausel

MySQL: Probleme mit JOINs

Verfasst: 06.11.2005, 18:48
von Daniela
Ich glaube ich sollte mir endlich mal ein richtiges Buch zu MySQL zulegen...

Re: MySQL: Probleme mit JOINs

Verfasst: 06.11.2005, 19:21
von Fox Mulder
Daniela hat geschrieben: Wie bekomme ich nur jeweils die Zeile mit dem neuesten Tiemstamp?

Code: Alles auswählen

order by timestamp desc
limit 1
Gruss

MySQL: Probleme mit JOINs

Verfasst: 06.11.2005, 19:59
von Daniela
Damit bekomme ich nur 1 Zeile mit dem neuestem Timestamp - ich will aber pro IP nur 1 Zeile mit je dem neuestem Timestamp.

MySQL: Probleme mit JOINs

Verfasst: 06.11.2005, 21:56
von tobsn
create temp table. hehe.

MySQL: Probleme mit JOINs

Verfasst: 06.11.2005, 22:08
von derHund
um den jeweils neuesten timestamp zu erhalten, mußt du nochmal left joinen ...

schau mal diesen kommentar:
https://dev.mysql.com/doc/refman/5.0/en ... html#c2022