Archiv verlassen und diese Seite im Standarddesign anzeigen : schwieriger join
hi, es geht um eine anwendung in der man tipps auf formel 1 rennen verwalten können soll.
folgendes problem:
ich habe 2 tabellen, eine tb_fahrer und eine tb_tipps..
tb_fahrer ist eine auflistung aller formel 1 fahrer, also 40 datensätze, mit id und namen, z.B. :
id name
1 michael schumacher
tb_tipps enthält die abgegebenen tipps, mit id, user, rennen, erster, zweiter, dritter.
unter erster, zweiter, dritter, speicher ich eine Zahl die als Fremdschlüssel auf die tb_fahrer.id referenziert.
Nun möchte ich beim auslesen, natürlich nicht die nummern der fahrer haben, sondern gleich statt der 1 den "michael schumacher" haben und eben die namen der fahrer.
ich brauch ein statement das alle nummern der fahrer durch ihren namen ersetzt.
ich habs mit einem join gemacht, z.B. tb_fahrer inner join tb_tipps on tb_fahrer.id = erster
aber was ist dann mit "zweiter" und "dritter"
bitte un hilfe.
SELECT *
FROM tb_tipps t
INNER JOIN tb_fahrer f1 ON t.erster = f1.id
INNER JOIN tb_fahrer f2 ON t.zweiter = f2.id
INNER JOIN tb_fahrer f3 ON t.dritter = f3.id
danke!
dafür hätte ich noch ewig gebraucht!
whow! :)
SELECT t.*, f1.name f1_name, f2.name f2_name, f3.name f3_name
FROM tb_tipps t
INNER JOIN tb_fahrer f1 ON t.erster = f1.id
INNER JOIN tb_fahrer f2 ON t.zweiter = f2.id
INNER JOIN tb_fahrer f3 ON t.dritter = f3.id
Mit PHP solltest in der Feldliste mit Aliasen Arbeiten (s.o.) sonst überschreiben sich die Namen gegenseitig ...
ja, hab ich. und alles vollqualifiziert. hat wunderbar geklappt.
thx.
inzwischen addiert sich der select zu einem echten Monster, geht schon über einige zeilen...
ich habe nun auch noch eine ergebnistabelle, ähnlich aufgebaut wie die Tipps Tabelle, also ich habe auch spalten erster, zweiter, dritter.
jetzt möchte ich noch gleich mit diesem select die sätze markieren in denen die Tipps komplett mit dem Ergebnis übereinstimmen, (tip.erster = erg.erster and tip.zweiter = erg.zweiter, tip.dritter = erg.dritter)
das ich die sätze mit einem if vergleichen kann hab ich rausgefunden, aber alles geht schon schief sobald ich die Ergebnisstabelle noch zusätzlich einbeziehe. dann erscheinen plötzlich alle Datensätze neunfach :O
bisher:
Select tip.status, tip.event_id, fah1.fahrername as ersterName,
fah2.fahrername as zweiterName, fah3.fahrername as dritterName,
tip.datum, acc_nick
from tipps tip
inner join userdaten on acc_id = f_acc_id
inner join wb_fahrer fah1 on fah1.id = tip.erster
inner join wb_fahrer fah2 on fah2.id = tip.zweiter
inner join wb_fahrer fah3 on fah3.id = tip.dritter
order by tip.event_id desc, tip.datum desc, tip.status desc
nachher und hier tritt der fehler auf:
Select tip.status, tip.event_id, fah1.fahrername as ersterName,
fah2.fahrername as zweiterName, fah3.fahrername as dritterName,
tip.datum, acc_nick, erg.erster, erg.zweiter, erg.dritter
from ergebnisse erg, tipps tip
inner join userdaten on acc_id = f_acc_id
inner join wb_fahrer fah1 on fah1.id = tip.erster
inner join wb_fahrer fah2 on fah2.id = tip.zweiter
inner join wb_fahrer fah3 on fah3.id = tip.dritter
order by tip.event_id desc, tip.datum desc, tip.status desc
danke für hilfe
mrhappiness 23-06-2003, 19:43 liegt wahrsc heinlich daran, dass an die ergebnistabelle eine bedingung geknüpft wurde, kann das sein?
btw: bau doch in deine beiden selects den ein oder anderen zeilenumbruch ein, das kann ja kein mensch lesen
weiss nicht was für eine bedingung Du meinst, aber ich weiss jetzt wieso die sätze 9-fach angezeigt werden.
es liegt daran das in der ergebnistabelle 9 sätze drin stehen, die ergebnisse für alle rennen von melbourne bis zum nürburgring :)
ok, ich habs.
ich musste noch auf die event_id joinen damit immer nur ergebnisse und Tipps mit der selben event_id verglichen wurden.
thx.
dieser select:
Select tipps.status, tipps.event_id, fah1.fahrername as ersterName,fah1.id as tippsErster,
erg.erster as ergErster, fah2.fahrername as zweiterName,fah2.id as tippsZweiter,
erg.zweiter as ergZweiter ,fah3.fahrername as dritterName, fah3.id as tippsDritter,
erg.dritter as ergDritter, tipps.datum, acc_nick,
if(fah1.id = erg.erster and fah2.id = erg.zweiter and fah3.id = erg.dritter,'richtig','falsch') as tippspbewertung
führt zu diesem ergebnis:
sulay 9 Michael Schumacher Kimi Räikkönen Rubens Barrichello offen 2003-06-28 12:17:58 falsch
bismaster 9 Michael Schumacher Rubens Barrichello Rubens Barrichello offen 2003-06-24 21:26:04 falsch
LI 9 Michael Schumacher Kimi Räikkönen Ralf Schumacher offen 2003-06-23 12:13:35 falsch
jede zeile steht für einen tipp eines users, in der letzten spalte steht ob der tipp richtig oder falsch war.
jetzt möchte ich gerne zählen wie viele richtige Tipps ein User hat ?
geht das mit distinct ?
ich hab manchmal probleme spalten anzusprechen die ich mit einem alias belegt habe (as tippbewertung)
schreibe ich z.b. noch das:
where tippbewertung = 'richtig'
sagt er "unknown column"
danke für jede hilfe.
ahh, ok, zählen kann ich die mit count(*). das war einfach ;)
aber wieso klappt das mit den aliases nicht immer ?
|
|