Select Query über Tabellen übergreiffend

andrejedd

Benutzer
Beiträge
9
Hallo zusammen ich kämpfe seit einigen Stunden mit einem Query das eigendlich ziemlich simepl sein sollte. Ich nehme mal an das ein Blackout dafür zuständig ist, da ich schon kompliziertere Querys zusammengestellt habe. Nun wollte ich euch um Rat fragen um nicht noch mehr Zeit zu verschwenden für ein solch "mittelmässig"-simples Query. Folgendermassen:

Das sind die zwei Tables:
User:
  • uid (PK)
  • uniqueId (Eindeutige ID welche vom PHP erstellt wird. String welcher aus X-Zeichen besteht)
  • username
  • name
  • description
Abo
  • aid
  • uid1 (foreignkey zu user.uid)
  • uid2 (foreignkey zu user.uid)
In der Tabelle Abo sollten zwei Benutzer pro Zeile gespeichert sein (zeigt welcher User, welchen Abonniert hat).
Folgende Ausgabe möchte ich:
user.username, user.name, user.description, count(abo.uid1), count(abo.uid2)
PS: es sollte mir nicht die gesamte menge über alle datensetze geben, sondern es sollte mir alle Datensetze geben von dem Benutzer mit der uniqueID = "dummy1234".

Sprich, es sollte die uid holen vom benutzer mit uniqueId="dummy1234" und danach die abo table durchsuchen und dann den count von uid1 und uid2 zurück geben wo nur diese uid des benutzers vorkommt.

Mein bisheriges Query:


SELECT u.username as username, u.name as name, u.description as description, count(a.uid1) as following, count(a.uid2) as follower FROM user u
INNER JOIN abo a ON u.id = a.uid1
INNER JOIN user b ON b.id = a.uid2
where u.uid="dummy1234";

Danke im Vorraus. :)
 
Werbung:
@Akretschmer_mobile hättest du gerade das fertige query? oder was meinst du mit gruppieren und wozu dies?

nun habe ich folgendes query erstellt und kriege trotzdem den falschen output:

Query:
SELECT count(a.uid1) as following, count(a.uid2) as follower, u.username as username, u.name as name, u.description as description FROM abo a
INNER JOIN user u ON a.uid1 = u.id
INNER JOIN user b ON a.uid2 = b.id
where u.uid = "dummy123";

Output:
2 | 2 |user.name | dummyName | Dummy Description

Der falsche output ist das da es vorne zuerst eine 2 anzeigen sollte und danach eine eins also:
2 | 1 |user.name | dummyName | Dummy Description
 
Zuletzt bearbeitet:
oder was meinst du mit gruppieren und wozu dies?

Um Dir das zu erklären:

Du hast, vereinfacht, dies:

Code:
test=*# \d t_user;
  Table "public.t_user"
 Column |  Type  | Modifiers
--------+---------+-----------
 id  | integer | not null
 name  | text  |
Indexes:
  "t_user_pkey" PRIMARY KEY, btree (id)
Referenced by:
  TABLE "t_abo" CONSTRAINT "t_abo_u1_fkey" FOREIGN KEY (u1) REFERENCES t_user(id)
  TABLE "t_abo" CONSTRAINT "t_abo_u2_fkey" FOREIGN KEY (u2) REFERENCES t_user(id)

test=*# \d t_abo;
  Table "public.t_abo"
 Column |  Type  | Modifiers
--------+---------+-----------
 u1  | integer |
 u2  | integer |
Foreign-key constraints:
  "t_abo_u1_fkey" FOREIGN KEY (u1) REFERENCES t_user(id)
  "t_abo_u2_fkey" FOREIGN KEY (u2) REFERENCES t_user(id)

und versuchst sowas, wieder vereinfacht:

Code:
test=*# select count(a.u1), count(a.u2), u.name from t_abo a left join t_user u on a.u1=u.id left join t_user b on a.u2=b.id;
ERROR:  column "u.name" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select count(a.u1), count(a.u2), u.name from t_abo a left jo...
  ^
test=*#

MySQL, im Gegensatz zu PostgreSQL und anderen Datenbanken und zu MySQL ab 5.7, erkennt den logischen Fehler im SQL nicht und liefert ein zufälliges Ergebniss anstatt einer Fehlermeldung.

Das versuchst Du nun erst einmal zu verstehen. Bis dahin verbleibe ich mal im Urlaubsmodus ;-)
 
@akretschmer ich verstehe es immernoch nicht ich kenne PostgreSQL gar nicht, deshalb wird es schwierig das überhaupt zu vergleichen. Also einfach für mich.

Was tue ich denn falsch? Wie kann ich es lösen? Wird dieses Query doch so schwer?
 
Werbung:
Zurück
Oben