Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

MySQL: Probleme mit JOINs

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
Daniela
PostRank 4
PostRank 4
Beiträge: 113
Registriert: 13.09.2004, 20:09
Wohnort: Hamburg

Beitrag von Daniela » 06.11.2005, 15:33

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

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Fox Mulder
PostRank 8
PostRank 8
Beiträge: 804
Registriert: 16.11.2004, 09:06

Beitrag von Fox Mulder » 06.11.2005, 16:22

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

Anonymous

Beitrag von Anonymous » 06.11.2005, 16:38

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....

Daniela
PostRank 4
PostRank 4
Beiträge: 113
Registriert: 13.09.2004, 20:09
Wohnort: Hamburg

Beitrag von Daniela » 06.11.2005, 16:44

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.

magadoo
PostRank 5
PostRank 5
Beiträge: 257
Registriert: 02.11.2004, 14:14

Beitrag von magadoo » 06.11.2005, 18:08

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

Daniela
PostRank 4
PostRank 4
Beiträge: 113
Registriert: 13.09.2004, 20:09
Wohnort: Hamburg

Beitrag von Daniela » 06.11.2005, 18:18

Call me Supermega-Depp. :bad-words:

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

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

Danke!

Daniela
PostRank 4
PostRank 4
Beiträge: 113
Registriert: 13.09.2004, 20:09
Wohnort: Hamburg

Beitrag von Daniela » 06.11.2005, 18:25

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?

magadoo
PostRank 5
PostRank 5
Beiträge: 257
Registriert: 02.11.2004, 14:14

Beitrag von magadoo » 06.11.2005, 18:39

@ Supermega-Depp

Nein :lol:

@ Daniela

Evtl. mit der "Group By"-Klausel

Daniela
PostRank 4
PostRank 4
Beiträge: 113
Registriert: 13.09.2004, 20:09
Wohnort: Hamburg

Beitrag von Daniela » 06.11.2005, 18:48

Ich glaube ich sollte mir endlich mal ein richtiges Buch zu MySQL zulegen...

Fox Mulder
PostRank 8
PostRank 8
Beiträge: 804
Registriert: 16.11.2004, 09:06

Beitrag von Fox Mulder » 06.11.2005, 19:21

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

Daniela
PostRank 4
PostRank 4
Beiträge: 113
Registriert: 13.09.2004, 20:09
Wohnort: Hamburg

Beitrag von Daniela » 06.11.2005, 19:59

Damit bekomme ich nur 1 Zeile mit dem neuestem Timestamp - ich will aber pro IP nur 1 Zeile mit je dem neuestem Timestamp.

tobsn
PostRank 7
PostRank 7
Beiträge: 495
Registriert: 26.10.2005, 02:10

Beitrag von tobsn » 06.11.2005, 21:56

create temp table. hehe.
Unterhalte Dich mit anderen im SEO & ADSENSE IRC CHAT! :D
/server irc.german-elite.net -j #SEO
_________________
theonlybushilike.com!
_________________
"There are three kinds of lies: lies, damned lies, and statistics."
— Benjamin Disraeli (1804-1881), British politician

derHund
PostRank 5
PostRank 5
Beiträge: 296
Registriert: 08.01.2005, 14:39

Beitrag von derHund » 06.11.2005, 22:08

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

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag