Mehrere nicht zusammenhängende Tabellen abfragen

Hey!

Ich stehe grad ein bisschen auf dem Schlauch.
Wie kann ich mehrere Tabellen, die in keinster Weise zusammenhängen in einer einzigen Query abfragen?

Folgende Abfrage gibt mir ein leeres Resultat zurück, obwohl Daten vorhanden sind. Das ist verständlich, weil nicht alle Bedingungen erfüllt sind (z.B. sind keine neuen Nachrichten vorhanden):

SELECT login.points, COUNT(messages.id) AS messageCount, COUNT(useronline.id) AS userCount
FROM login, messages, useronline
WHERE login.username = ‚C-Jay‘
AND messages.username = ‚C-Jay‘
AND messages.new = 1
AND useronline.timestamp >= ‚1267966464‘
GROUP BY login.username

Ich weiß auch nicht, weshalb ich die „GROUP BY“ Bedingung einbauen musste und, ob sie richtig eingebaut ist, aber ohne die Bedingung hab ich einen Fehler zurück bekommen (Mixing of GROUP columns (MIN(),MAX(),COUNT(),…) with no GROUP columns is illegal if there is no GROUP BY clause).

Mein Ziel ist es, dafür EINE Query zu verwenden, weil das ganze möglichst schnell gehen soll (Ajax).

Kann vielleicht jemand helfen?

Gruß Christoph

Hallo,

also das Group by muste rein, weil du Domänenaggregatsfunktionen nutzt, sprich „Count“

Mein Ziel ist es, dafür EINE Query zu verwenden, weil das
ganze möglichst schnell gehen soll (Ajax).

Da du nicht den Tabellenaufbau beschrieben hat, will ich es mal allgemein versuchen.
Du hast drei Tabellen, die du NACHEINANDER abfragen könntest. Möchtest aber nach Abfrage aller drei ein konsolidiertes Ergebnis haben.

Also musst du die 3 Abfragen nacheinander machen und als UNION Abfrage
erstellen. Dabei ist drauf zu achten, das die Fehler in der gleichen Reihenfolge untereinander sthen und gleiche Typen haben.
MAch dich über UNION schlau in der Hilfe.

UNION-Abfragen stellen Ergebnisse verschiedener Abfragen UNTEREINANDER.

HTH

Gruß
Proteus

Überhaupt relevant?
Hey!

Danke für die Antwort! UNION werde ich mir angucken.
Aber vielleicht mal anders: macht es überhaupt Sinn, die Abfragen (z.B. mit Hilfe von UNION) vereinen zu wollen? Der zeitliche Unterschied dürfte doch eigentlich nicht sonderlich groß sein, oder?

Gruß Christoph

Hallo Christoph,

doch das macht unter Umständen schon Sinn, immerhin gibt es eine konsolidierte Ergebismenge.

Ich gebe dir 2 beispiele.

  1. du hast 2 tabellen, eine mit mitarbeitern und eine mit abteilungen, jeweils mit emailadressen.
    Möchtest du z.b. jetzt ein DropDown füllen mit allen emailadressen, dann ist die UNION die beste Variante.

Ich habe auf einer Website - aus historischen Gründen - eine Tabelle mit AdminUsern und Rechten und eine mit normalen Usern.
Das Login läuft in diesem Fall über die UNION, damit ich ncht separate Logins benötige, je nach Gruppe.

Macht das Sinn ?

Gruß
Proteus

Hey!

In meinem speziellen Fall möchte ich einfach die Login Infos sammeln und alle 10 Sekunden aktualisieren. Die User, die zur Zeit Online sind, der Kontostand und die Anzahl der Kurzmitteilungen stehen in verschiedenen Tabellen. Zur Zeit sind es einfach 3 SELECT Abfragen.

In deinen Beispielen macht es durchaus Sinn UNION zu verwenden, aber würde es merkliche Auswirkungen auf die Serverlast oder die Performace haben, diese 3 Abfragen zu einer zusammen zu führen?

Danke und Gruß
Christoph

Mehrfacher COUNT
Moin, Christoph,

ich glaube nicht, dass sich Werte aus 2 (genauer: mehr als einer) Tabellen in einer Abfrage zählen lassen. Mit count werden ja keine Summen gebildet und irgendwo zwischengelagert, sondern einfach die Sätze gezählt, die in die Treffermenge passen. Die Treffermenge ist aber gerade das Kreuzprodukt der 3 Tabellen, ergo gibt es so auch keinen korrekten Count.

Gruß Ralf

Hallo,

das hört sich schon anders an.

In meinem speziellen Fall möchte ich einfach die Login Infos
sammeln und alle 10 Sekunden aktualisieren. Die User, die zur
Zeit Online sind, der Kontostand und die Anzahl der
Kurzmitteilungen stehen in verschiedenen Tabellen. Zur Zeit
sind es einfach 3 SELECT Abfragen.

Die 10 Sek. kannst du ja gar nicht einhalten, wenn die Page den Select ausführt.
Und bei jedem Seitenaufruf zu prüfen mit ner UNION ist nicht so der Brecher. Ich würde dir vorschlagen, deine Struktur der Datenbank nochmals anzuschauen. Irgendwie haben die 3 Tabellen ja doch was miteinander zu tun. Dann in die Normalform und das ganze geht über entsprechende Joins; und die kannst du dann jedesmal ausführen.
Kontostand und Kurzmitteilungen haben ja mit Sicherheit die Zuordnung zur Person, und schon klappt das über Beziehungen.

Gruß
Proteus