Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
schwieriger join [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
schwieriger join


 
sulay
20-06-2003, 03:13 
 
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.

 
goth
20-06-2003, 04:19 
 
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

 
sulay
20-06-2003, 04:58 
 
danke!

dafür hätte ich noch ewig gebraucht!

whow! :)

 
goth
20-06-2003, 14:12 
 
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 ...

 
sulay
20-06-2003, 17:15 
 
ja, hab ich. und alles vollqualifiziert. hat wunderbar geklappt.

thx.

 
sulay
23-06-2003, 19:11 
 
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

 
sulay
23-06-2003, 20:01 
 
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 :)

 
sulay
23-06-2003, 20:11 
 
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.

 
sulay
28-06-2003, 15:02 
 
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.

 
sulay
28-06-2003, 15:22 
 
ahh, ok, zählen kann ich die mit count(*). das war einfach ;)

aber wieso klappt das mit den aliases nicht immer ?


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:40 Uhr.