MySQL Abfrage
Daniel
- datenbank
Ahoi @ll,
ich habe gerade ein kleines (denk) problem. ich habe eine Aufgabenverwaltung geschrieben und habe 2 tabellen:
benutzer:
----------------------------
| id | vorname | nachname |
----------------------------
aufgabe:
-----------------------------------------------------------
| zu_erledigen_von_id | erstellt_von_id | aufgabendaten....
-----------------------------------------------------------
Ich gebe die daten aus, kein problem. nun soll man filtern können.
sowohl auf vor/nachname des erstellers als auch vor/nachname
desjenigen der es erledigen soll. und da liegt der hund begraben. ich
habe ein inner join für den der es erledigen soll, das funktioniert
auch alles einwandfrei, nur weis ich nicht wie ich das 2te inner join
machen muss um eine unterscheidung hinzubekommen, ein benutzer.vorname
as abc geht ja nicht da es auf beides wirkt.
MfG
echo $begrüßung;
ich habe ein inner join für den der es erledigen soll, das funktioniert
auch alles einwandfrei, nur weis ich nicht wie ich das 2te inner join
machen muss um eine unterscheidung hinzubekommen
Joine die Tabelle benutzer ein zweites Mal und vergib dabei einen anderen Alias.
echo "$verabschiedung $name";
Ahoi dedlfix,
Joine die Tabelle benutzer ein zweites Mal und vergib dabei einen anderen Alias.
und wie genau sehe das aus? ich hab noch nie mit nem Alias gejoint, oder
müsste das über heißen, oder gar ganz anders? aufjedenfall habe ich
bisher keine alias benutzt.
MfG
echo $begrüßung;
Joine die Tabelle benutzer ein zweites Mal und vergib dabei einen anderen Alias.
und wie genau sehe das aus?
SELECT aufgabe.*, b1.nachname AS name_erledigen, b2.nachname AS name_erstellt
FROM aufgabe
JOIN benutzer AS b1 ON b1.id=aufgabe.zu_erledigen_von_id
JOIN benutzer AS b2 ON b2.id=aufgabe.erstellt_von_id
WHERE ...
Vermutlich wirst du ein LEFT JOIN nehmen wollen, da du sicher auch Datensätze ohne Zuordnung haben möchtest.
echo "$verabschiedung $name";
Ahoi dedlfix,
Vermutlich wirst du ein LEFT JOIN nehmen wollen, da du sicher auch Datensätze ohne Zuordnung haben möchtest.
nein, jede aufgabe wurde von einem benutzer erstellt und soll von einem
u.U. anderen erledigt werden. daher INNER JOIN.
MfG
echo $begrüßung;
nein, jede aufgabe wurde von einem benutzer erstellt und soll von einem
u.U. anderen erledigt werden. daher INNER JOIN.
Unterschiedliche Benutzer sind nicht relevant. Wichtig ist nur, ob beispielsweise der Ersteller schon eingetragen ist, und der Erlediger noch nicht (id=0). Dann findet der erste INNER JOIN zwar einen benutzer-Eintrag für den Ersteller aber der zweite keinen für den Erlediger. Der Datensatz ist dann nicht mit in der Ergebnismenge enthalten.
Wenn das so gewünscht ist, oder nicht vorkommt, weil immer Ersteller und Erlediger eingetragen sind, dann tuts natürlich auch der INNER JOIN.
echo "$verabschiedung $name";
Ahoi dedlfix,
Wenn das so gewünscht ist, oder nicht vorkommt, weil immer Ersteller und Erlediger eingetragen sind, dann tuts natürlich auch der INNER JOIN.
Das ist der Fall, wenn ein neuer eintrag zu den aufgaben hinzukommt,
dann weis ich, bzw das script welcher Benutzer den Eintrag erstellt, da
das ganze über ein PHP Formular läuft und dort jmd ausgewählt werden
muss der es erledigen soll ist auch hier dann eine ID vorhanden, es gibt
noch eine status spalte ob die aufgabe noch offen oder schon erledigt ist.
Hab das jetzt eingefügt und bekomme diese Fehlermeldung:
Column: 'nachname_user' in where clause is ambiguous
was hat das zu bedeuten?
ambiguous bedeutet laut leo.org soviel wie mehrdeutig
http://dict.leo.org/?lp=ende&lang=de&searchLoc=0&cmpType=relaxed&relink=on§Hdr=on&spellToler=std&search=ambiguous
MfG
echo $begrüßung;
Hab das jetzt eingefügt und bekomme diese Fehlermeldung:
Column: 'nachname_user' in where clause is ambiguous
was hat das zu bedeuten?
ambiguous bedeutet laut leo.org soviel wie mehrdeutig
Richtig. Du hast sicherlich vergessen, den Aliasnamen der Tabelle davor zu schreiben.
echo "$verabschiedung $name";
Ahoi dedlfix,
Richtig. Du hast sicherlich vergessen, den Aliasnamen der Tabelle davor zu schreiben.
wo? es sieht so aus, vll hilfts weiter:
SELECT *,
b2.vorname_user AS vorname_ersteller,
b2.nachname_user AS nachname_ersteller,
b1.vorname_user AS vorname_erlediger,
b1.nachname_user AS nachname_erlediger FROM aufgaben
INNER JOIN benutzer AS b1 ON(b1.id_user = aufgaben.user_id)
INNER JOIN benutzer AS b2 ON(b2.id_user = aufgaben.erstellt_user_id) ORDER BY datum_uhrzeit desc
wo fehlt da was?
MfG
echo $begrüßung;
Column: 'nachname_user' in where clause is ambiguous
SELECT *,
b2.vorname_user AS vorname_ersteller,
b2.nachname_user AS nachname_ersteller,
b1.vorname_user AS vorname_erlediger,
b1.nachname_user AS nachname_erlediger FROM aufgaben
INNER JOIN benutzer AS b1 ON(b1.id_user = aufgaben.user_id)
INNER JOIN benutzer AS b2 ON(b2.id_user = aufgaben.erstellt_user_id) ORDER BY datum_uhrzeit descwo fehlt da was?
Wo: vor dem ORDER BY
Was: die beanstandete WHERE-Klausel
echo "$verabschiedung $name";
Ahoi dedlfix,
Wo: vor dem ORDER BY
Was: die beanstandete WHERE-Klausel
oh, hab ich doch glatt das WHERE mitweggeschnipselt als ich die ganzen
anderen inner joins rausgeschmissen habe. hab jetzt vor den aliasnamen
das b1 bzw. b2 gesetzt. jetzt meint er er kennt diese spalte nicht.
MfG
echo $begrüßung;
hab jetzt vor den aliasnamen das b1 bzw. b2 gesetzt. jetzt meint er er kennt diese spalte nicht.
Du musst den Aliasnamen der Tabelle aber den echten Spaltennamen nehmen (b2.nachname, b1.vorname, etc.).
echo "$verabschiedung $name";
Ahoi dedlfix,
Du musst den Aliasnamen der Tabelle aber den echten Spaltennamen nehmen (b2.nachname, b1.vorname, etc.).
*grml* naja danke, jetzt funktionierts einwandfrei.
MfG