für mich z.Z. zu komplizierte Abfrage
Twilo
- datenbank
Hallo,
meine Datenbank
Tabelle1 Tabelle2
+------------+------------+
| _id | _id |
| _parent_id | _user_id |
| ... | ... |
+------------+------------+
ich brauche eine Datenbankabfrage in MySQL
ich habe/bekomme "_parent_id" damit muss ich aus Tabelle1 die _id's Abfragen, wo _parent_id = der übergeben id ist
danach muss/brauch ich dann aus der Tabelle2 die ganzen Datensätze, wo die _user_id mit den _id's aus der Tabelle1 übereinstimmen
ist das überhaupt möglich?
mfg
Twilo
Moin!
Tabelle1 Tabelle2
+------------+------------+
| _id | _id |
| _parent_id | _user_id |
| ... | ... |
+------------+------------+
ich habe/bekomme "_parent_id" damit muss ich aus Tabelle1 die _id's Abfragen, wo _parent_id = der übergeben id ist
danach muss/brauch ich dann aus der Tabelle2 die ganzen Datensätze, wo die _user_id mit den _id's aus der Tabelle1 übereinstimmen
$sql = "select b._user_id from tabelle1 a, tabelle2 b where a._parent_id = $uebergabe AND b._id = a._id";
Lese dazu noch:http://dev.mysql.com/doc/mysql/de/JOIN.html
tschüssi
ichen
Hallo,
Tabelle1 Tabelle2
+------------+------------+
| _id | _id |
| _parent_id | _user_id |
| ... | ... |
+------------+------------+ich habe/bekomme "_parent_id" damit muss ich aus Tabelle1 die _id's Abfragen, wo _parent_id = der übergeben id ist
danach muss/brauch ich dann aus der Tabelle2 die ganzen Datensätze, wo die _user_id mit den _id's aus der Tabelle1 übereinstimmen$sql = "select b._user_id from tabelle1 a, tabelle2 b where a._parent_id = $uebergabe AND b._id = a._id";
Lese dazu noch:http://dev.mysql.com/doc/mysql/de/JOIN.html
das kann die Lösung nicht sein, ich bekomme viel zu wenig Datensätze
Tabelle1 Tabelle2
_id _parent_id _id _user_id
1 1 1 9
6 1 2 6
7 1 3 1
8 7 4 1
9 6 5 1
10 1 6 1
11 1 7 1
12 1 8 1
13 1 9 1
10 1
11 6
wenn ich jetzt als _parent_id 1 angebe, muss ich aus Tabelle2 alle Datensätze bekommen
gebe ich aber als _parent_id 6 an, darf ich aus der Tabelle2 nur den Datenatz 1 bekommen
wenn ich 7 angebe, darf kein Datenatz zurückgegeben werden
mfg
Twilo
Hallo,
Datensatz 2 und 11 müssen bei _parent_id 6 auch ausgegeben werden
mfg
Twilo
Du weißt schon, was Du willst... Oder?
Hast Du evtl. parent_id und user_id verwechselt?
Hallo,
Du weißt schon, was Du willst... Oder?
ja ;-)
Hast Du evtl. parent_id und user_id verwechselt?
wenn parent_id übergeben wird, würde ja eigentlich nur der Datensatz 9 aus Tabelle2 kommen
aber der User 6 hat auch 2 Beiträge erstellt, die sollen natürlich auch ausgegeben werden
mfg
Twilo
yo,
$sql = "select b._user_id from tabelle1 a, tabelle2 b where a._parent_id = $uebergabe AND b._id = a._id";
select a._id, b._user_id
from tabelle1 a, tabelle2 b
where a._parent_id = $uebergabe
AND b._user_id = a._id";
Ilja
Hallo,
select a._id, b._user_id
from tabelle1 a, tabelle2 b
where a._parent_id = $uebergabe
AND b._user_id = a._id";
das sieht schon super aus
hab es etwas abgeändert
select b._id, b._user_id
from tabelle1 a, tabelle2 b
where a._parent_id = 6
AND b._user_id = a._id
dann gibt er alle aus, wo _parent_id = 6 ist
also Datensatz 9
ich bräuchte aber noch Datensatz 2 und 11
https://forum.selfhtml.org/?t=96456&m=586738
dann hab ich es so probiert
select b._id, b._user_id
from tabelle1 a, tabelle2 b
where (a._parent_id = $uebergabe
AND b._user_id = a._id) OR b._user_id = 6
nur, was er mir da ausgibt, ist totaler Mist
insgesammt 37 Datensätze
es dürfen eigentlich nur 3 sein
sieht ganz nach einer Kreuzverbindung aus...
mfg
Twilo
yo,
meiner meinung nach widersprichst du dir in deinen aussagen.
genau das sollte die abfrage liefern, die ich dir gegeben habe.
und das widerspricht deinem ersten wunsch. dieser 2. und 11. datensatz weißt auf den ---> user <--- 6 und nicht auf die user, die als parent_id 6 haben.
zum anderen hast du innerhalb der ersten tabelle eine rekursion, die man nach möglichkeit vermeiden sollte.
Ilja
Hallo,
meiner meinung nach widersprichst du dir in deinen aussagen.
- ich habe/bekomme "_parent_id" damit muss ich aus Tabelle1 die _id's Abfragen, wo _parent_id = der übergeben id ist
danach muss/brauch ich dann aus der Tabelle2 die ganzen Datensätze, wo die _user_id mit den _id's aus der Tabelle1 übereinstimmen
in der Abfrage sollen beide Varianten berücksichtigt werden
genau das sollte die abfrage liefern, die ich dir gegeben habe.
ja, ich bekomme den Datensatz 9, brauche aber dazu noch den Dytensatz 2 und 11
den Datensatz 9 hat ein User vom User 6 erstellt
Datensatz 2 und 11 hat der User 6 erstellt
- ich bräuchte aber noch Datensatz 2 und 11
und das widerspricht deinem ersten wunsch. dieser 2. und 11. datensatz weißt auf den ---> user <--- 6 und nicht auf die user, die als parent_id 6 haben.
mit der Abfrage sollen alle Datensätze abgerufen werden, die ihm gehören bzw. einen User von Ihm gehört
zum anderen hast du innerhalb der ersten tabelle eine rekursion, die man nach möglichkeit vermeiden sollte.
wie meinst du das?
die erste Tabelle enthält die User
_parent_id gibt an, welcher User diesen User erstellt hat
wie kann ich das denn anders lösen?
mfg
Twilo
yo,
ja, ich bekomme den Datensatz 9, brauche aber dazu noch den Dytensatz 2 und 11
gut, das war aus deinem ursprungsposting nicht ganz klar hervorgegangen.
die erste Tabelle enthält die User
_parent_id gibt an, welcher User diesen User erstellt hat
genau das nennt man eine rekursion.
ich werde mich noch mal einen anderen tag melden, gehe nun ins kino, freundin ist hier und wir sehen einen typischen frauenfilm.....
Ilja
Hallo,
ja, ich bekomme den Datensatz 9, brauche aber dazu noch den Dytensatz 2 und 11
gut, das war aus deinem ursprungsposting nicht ganz klar hervorgegangen.
ich hab mich dort etwas unklar ausgedrückt :-(
die erste Tabelle enthält die User
_parent_id gibt an, welcher User diesen User erstellt hat
genau das nennt man eine rekursion.
ich werde mich noch mal einen anderen tag melden,
hier über's Forum, oder per eMail?
gehe nun ins kino, freundin ist hier und wir sehen einen typischen frauenfilm.....
dann mal viel spass :-P
mfg
Twilo
yo,
du hast bei deinem ersten versuch die klammern falsch gesetzt, AND bindet stärker als OR.
select b._id, b._user_id
from tabelle1 a, tabelle2 b
where (a._parent_id = 6 OR a._id= 6)
AND b._user_id = a._id
Ilja
Hallo,
du hast bei deinem ersten versuch die klammern falsch gesetzt, AND bindet stärker als OR.
select b._id, b._user_id
from tabelle1 a, tabelle2 b
where (a._parent_id = 6 OR a._id= 6)
AND b._user_id = a._id
das klappt so weit, hat aber noch einen kleinen Schönheitsfehler
z.B. User 9 hat ein Beitrag erstellt
diese Beiträge werden zur Zeit nicht angezeigt.
User 9 gehört nicht zu User 6 sondern zu User 8
User 8 gehört aber zu User 6
User 9 soll auch angezeigt werden
das meintest du sicherlich mit Rekursiv, oder?
wie kann man das am besten lösen?
mfg
Twilo
yo,
das meintest du sicherlich mit Rekursiv, oder?
ja, das ist rekursiv und insofern wird auch die abfrage rekursiv sein müssen. frage mich nur, warum du das nicht gleich erwähnt hast.
wie kann man das am besten lösen?
wenn es möglich ist, das daten-design so ändern, dass keine rekursion mehr vorhanden ist.
Ilja
Hallo,
wie kann man das am besten lösen?
wenn es möglich ist, das daten-design so ändern, dass keine rekursion mehr vorhanden ist.
ich frage mich gerade, wie ich das anstellen soll ;-)
User1
|
+-- User2
|
+-- User3
| |
| +-- User8
| | |
| | + User12
| |
| +-- User9
| |
| +-- ....
|
+-- User15
| |
etc.
also User1 hat User2, User3, User15, etc. erstellt
diese User können auch User erstellen
wie würdest du das Datenbank Design machen?
mfg
Twilo
yo,
ich frage mich gerade, wie ich das anstellen soll ;-)
gute frage und bei rekursionen tue ich mich auch immer schwer. aber mein vorschläg wäre, welcher User welchen User erstellt hat in eine extra tabelle auszugliedern. dann hättest du deine normale User tabelle, in der die spalte mit den "überuser" wegfällt plus einer neuen tabellen, in der du zwei spalten hast, die zusammen einen PK bilden.
tabelle 2:
User | wurde_erstelt_von_User
dann sollte eigentlich die rekursion draussen sein und auch die abfrage besser zu bewerkstelligen sein.
Ilja
Hallo,
[...]
dann hättest du deine normale User tabelle, in der die spalte mit den "überuser" wegfällt plus einer neuen tabellen, in der du zwei spalten hast, die zusammen einen PK bilden.
was ist ein PK?
tabelle 2:
User | wurde_erstelt_von_User
dann sollte eigentlich die rekursion draussen sein und auch die abfrage besser zu bewerkstelligen sein.
die Rekursion besteht dann aber immer noch, oder?
denn ich würde diese eine Spalte ja nur ein eine neue Tabelle packen
oder hab ich ein Denkfehler?
mfg
Twilo
yo,
was ist ein PK?
primary key, bzw. primärschlüssel.
die Rekursion besteht dann aber immer noch, oder?
direkte rekursion in einer tabelle wäre, dass zwei spalten in unterschiedlichen zeilen voneinander abhängig sind. beispiel, der datensatz eines user in deinem daten-design hat einen verweis auf seinen ersteller. und dieser ersteller steht in einem anderen datensatz der gleichen tabelle. wenn du alles in eine zweite tabelle auslagerst, sollte die rekursion eigentlich nicht mehr vorhanden sein. aber wie gesagt, bei rekursionen tue ich mich auch immer schwer.
denn ich würde diese eine Spalte ja nur ein eine neue Tabelle packen
diese eine spalte plus eine weitere mit den user_id.
Ilja
Hallo,
direkte rekursion in einer tabelle wäre, dass zwei spalten in unterschiedlichen zeilen voneinander abhängig sind. beispiel, der datensatz eines user in deinem daten-design hat einen verweis auf seinen ersteller. und dieser ersteller steht in einem anderen datensatz der gleichen tabelle. wenn du alles in eine zweite tabelle auslagerst, sollte die rekursion eigentlich nicht mehr vorhanden sein. aber wie gesagt, bei rekursionen tue ich mich auch immer schwer.
hm...
diese Zusätzliche Tabelle würde doch so aussehen, oder?
+----------+------------+
| _user_id | _parent_id |
+----------+------------+
| 1 | 1 |
| 6 | 1 |
| 7 | 1 |
| 8 | 7 |
| 9 | 6 |
| 10 | 1 |
| 11 | 1 |
| 12 | 1 |
| 13 | 1 |
+----------+------------+
aber genauso sieht doch auch die andere Tabelle aus
irgendwie versteh ich das nicht :-(
mfg
Twilo
yo,
diese Zusätzliche Tabelle würde doch so aussehen, oder?
ja, genau so.
aber genauso sieht doch auch die andere Tabelle aus
irgendwie versteh ich das nicht :-(
nicht ganz, die rekursion ist nun hoffentlich draussen, da user und ersteller voneinander getrennt sind. die abhängigkeiten befinden sich nun in zwei tabellen.
Ilja
Hallo,
diese Zusätzliche Tabelle würde doch so aussehen, oder?
ja, genau so.
aber genauso sieht doch auch die andere Tabelle aus
irgendwie versteh ich das nicht :-(nicht ganz, die rekursion ist nun hoffentlich draussen, da user und ersteller voneinander getrennt sind. die abhängigkeiten befinden sich nun in zwei tabellen.
die Rekursion ist dann aber nicht aus der Welt geschaft, sondern nur in eine andere Tabelle ausgelagert *g*
der Inhalt aus der extra Tabelle, wurde 1:1 aus der anderen übernommen
hm...
mfg
Twilo
yo,
die Rekursion ist dann aber nicht aus der Welt geschaft, sondern nur in eine andere Tabelle ausgelagert *g*
die direkte rekursion ist es allemal, den diese ist immer nur innhalb einer tabelle. die frage ist, ob eine indirekte rekursion vorliegt. und auch das sollte nicht mehr der fall sein.
Ilja
Hallo,
die Rekursion ist dann aber nicht aus der Welt geschaft, sondern nur in eine andere Tabelle ausgelagert *g*
die direkte rekursion ist es allemal, den diese ist immer nur innhalb einer tabelle. die frage ist, ob eine indirekte rekursion vorliegt. und auch das sollte nicht mehr der fall sein.
doch die liegt imemr noch vor :)
ich werde mal bei Zeiten etwas googlen, vielleicht find ich ja etwas, wie man das am besten lösen kann
mfg
Twilo