SQL Multiple Select und Group By

JavaBeginner

Ensign
Registriert
Juli 2015
Beiträge
142
Multiple Select und Group By/SQL Foreach

Heyho, ich stehe seit gestern vor folgendem Problem:
Ich versuche irgendwie 2 verschiedene DATETIME Werte auszulesen (Anzahl der jeweiligen Werte nach Stunde sortiert) jedoch funktioniert das nicht so ganz da sofern ich nach Spalte A sortiere die Stundenwerte in Spalte B falsch sind. Sofern z.b. In Spalte B die Uhrzeit 12 vorhanden ist und in Spalte A nach welcher es gruppiert wird nicht ist, werden die Datenfalsch behandelt.

Beispielsweise:
Code:
Select Count(_SpalteB) as var0,Hour(_SpalteB) as var1, Count(_SpalteA) as var2, Hour(_SpalteA) as var3 from tabellen_werte where TIMESTAMPDIFF(day, _SpalteA, NOW())<365 group by HOUR(_SpalteA)

Geplant ist die Ausgabe der Werte für jede Stunde in einem Graphen. Bräuchte es in einem Statement jedoch bin ich am rätseln wie man das verwirklichen kann. Habe es mit einem zweiten Select Statement für Spalte B versucht was jedoch Fehler ausgab. Da es wahrscheinlich nicht möglich ist 2x Group BY zu verwenden damit die Werte von SpalteB nach den Stunden in SpalteB sortiert werden und das gleiche für SpalteA, wollte ich fragen was man da machen kann.


Das Foreach Problem ist folgendes, ich möchte gerne aus Tabelle X eine gesamte Spalte iterieren und überprüfen wie viele Einträge den selben Wert aufweisen. Also.
Code:
Select Count(_EmailSpalteA) as var0, Count(_EmailSpalteB) as var1 from Test_Table where TIMESTAMPDIFF(day, _created, NOW())<300 and _EmailSpalteA=(Select email from test.emails) OR _EmailSpalteB=(Select email from test.emails) GROUP BY (Select email from test.emails)

Geplant ist das die Einträge bei denen _EmailSpalteA mit email übereinstimmen gezählt und ausgegeben werden (das gleiche auch für _EmailSpalteB). Da es jedoch mehrere Datensätzen in test.emails gibt stehe ich nun vor dam Problem das ich nicht weiß wie ich hier vorgehen kann/muss. Wie kann man das lösen?


Danke.
 
Zuletzt bearbeitet:
Ist denn sichergestellt, dass in allen Zeilen, wo Hour(_SpalteA) gleich ist, auch Hour(_SpalteB) gleich ist? Ansonsten kann das nicht klappen.

Anders gefragt: Spricht was dagegen, SpalteA und SpalteB in zwei getrennten Queries abzufragen?
 
NullPointer schrieb:
Ist denn sichergestellt, dass in allen Zeilen, wo Hour(_SpalteA) gleich ist, auch Hour(_SpalteB) gleich ist? Ansonsten kann das nicht klappen.

Anders gefragt: Spricht was dagegen, SpalteA und SpalteB in zwei getrennten Queries abzufragen?

Das Problem habe mich gerade. _SpalteA speichert den Zeitpunkt vom erstellen des Datensatzes und _SpalteB speichert den letzten edit des Datensatzes. Meine Idee wäre halt das man eventuell das man unter ORDER BY einfach die Zahlen von 0-24 eintragen lässt. Sollte z.b. unter 2 kein Eintrag existent sein wird beiden Count values dementsprechend 0 stehen. Also, das ORDER BY nicht über eine Spalte sondern z.b. eine Schleife erstellt wird.
 
Da wirst du tatsächlich zwei Queries brauchen, eine für SpalteA und eine für SpalteB. Zweimal GROUP BY in der selben Query geht nicht (außer du schreibst GROUP BY SpalteA, SpalteB - aber dann wird nach beiden Spalten gleichzeitig gruppiert, was du ja nicht willst).

Deine andere Query habe ich noch nicht ganz verstanden. Du zählst, in wievielen Zeilen entweder EmailSpalteA oder EmailSpalteB einen Wert enthalten, der auch in test.emails steht. (Datenbank test, Tabelle emails - so richtig?) Ist dir denn dabei wichtig, ob der Wert in A oder B steht oder willst du einfach nur die Gesamtanzahl?

Falls letzteres, geht das einfach so:

Code:
SELECT COUNT(*) FROM Test_Table
WHERE TIMESTAMPDIFF(day, _created, NOW())<300
AND (_EmailSpalteA IN (SELECT email FROM test.emails) OR _EmailSpalteB IN (SELECT email FROM test.emails))

Falls du getrennte Counts für A und B brauchst, würde ich auch hier zwei Abfragen machen.
 
NullPointer schrieb:
Da wirst du tatsächlich zwei Queries brauchen, eine für SpalteA und eine für SpalteB. Zweimal GROUP BY in der selben Query geht nicht (außer du schreibst GROUP BY SpalteA, SpalteB - aber dann wird nach beiden Spalten gleichzeitig gruppiert, was du ja nicht willst).

Deine andere Query habe ich noch nicht ganz verstanden. Du zählst, in wievielen Zeilen entweder EmailSpalteA oder EmailSpalteB einen Wert enthalten, der auch in test.emails steht. (Datenbank test, Tabelle emails - so richtig?) Ist dir denn dabei wichtig, ob der Wert in A oder B steht oder willst du einfach nur die Gesamtanzahl?

Falls letzteres, geht das einfach so:

Code:
SELECT COUNT(*) FROM Test_Table
WHERE TIMESTAMPDIFF(day, _created, NOW())<300
AND (_EmailSpalteA IN (SELECT email FROM test.emails) OR _EmailSpalteB IN (SELECT email FROM test.emails))

Falls du getrennte Counts für A und B brauchst, würde ich auch hier zwei Abfragen machen.

Jap, bräuchte getrennte counts.
Also, ich versucht es mal in Worten zu erklären^^
Ich Habe eine Tabelle mit Emails, diese möchte ich mit einer foreach Schleife durchlaufen lassen um zu zählen wie oft es in SpalteA die Email x gibt und wie oft in SpalteB die Email x vorhanden ist. (x ist der momentane wert in der foreach loop).
 
Ok, jetzt wird's klarer. Versuch mal dies:

Code:
SELECT e.email, COUNT(t.*) AS num
FROM Test_Table t JOIN test.emails e ON e.email = t._EmailSpalteA
GROUP BY e.email

und das gleiche noch mal für t._EmailSpalteB.
 
Zurück
Oben