"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Datenbank & PHP: Denkhilfe

moidaschl 02.12.2004 - 18:42 733 9
Posts

moidaschl

Vollzeit-Hackler
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
Also Problemstellung:

Alle von euch werden sicher so clanseiten kennen, dass wenn man auf members klickt, kommen mal die squads und wenn man dann auf einen bestimmten spieler klickt bekommt man die einzelen infos mit foto usw..

Ok, bis jetzt noch kein Problem. I versuch sowas für einen Handballverein zu erstellen, nur leider folgendes Problem:

Es kann sein, dass ein Spieler in mehreren "Squads" gleichzeitig ist, allerdings wie realisier ich des am besten?

Mein Lösungsvorschlag:

In der Tabelle des Spielers ein Feld mit einem Ensprechenden Wert.

zb für Männer ein 'A'.
für Frauen ein 'B'.
Auch wenns unlogisch is, angenommen ein Spieler spielt bei beiden, dann würde dort 'AB' drinnen stehen.
Nur jetz muss ich des ja mit substr() oder so irgendwie herausfiltern welcher buchstabe drinnen steht, damit ja dann nur die spieler korrekt ausgegeben werden, die im squad vorhanden sind..
Allerdings wie durchsuche ich dann ein bestimmtest Feld nach einem Zeichen? Geht des überhaupt?

Oder denk ich vieel zu kompliziert? Gibts ja sicher einen Lösungsweg i hoff ihr könnts mir da helfen

(big) tia

Daschl
Bearbeitet von moidaschl am 04.12.2004, 20:39

rettich

Legend
waffle, waffle!
Avatar
Registered: Jan 2004
Location: wien
Posts: 794
viiiel zu kompliziert. du brauchst eine intersection table zwischen "squad" und "spieler", die nur einträge über die id vom spieler und die id der squad enthält

für jede zuteilung von spieler zu squad einen eintrag.

dann per join aus der DB kitzeln

select * from squads sq
join intersectiontable it on sq.oid = it.squad.oid
join spieler s on s.oid = it.spieler oid

-> hast alle squads mit den passenden spielern.

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14594
wie rettich schon sagte, viel zu kompliziert

besser ist das:

3 tabellen.

tabelle 1: spieler
tabelle 2: spieler_squads
tabelle 3: name_squads

tabelle 2 enthält: id, spieler_id, squad_id

tabelle 3 enthält: id, name

das würd dann z.b. so aussehen

tabelle1:

id=1
name=Hans
position=honk

tabelle2:

id=(wurscht)
spieler_id=1
squad_id=2

tabelle3:

id=1
name=frauen

id=2
name=männer

soda und dann das ganze noch mit (left)join zusammenhexeln.

mfg

moidaschl

Vollzeit-Hackler
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
mhm weil du des so schreibst is mir noch eine idee gekommen:

wieso ned einfach, wenn einer hinzugefügt wurde, die spieler-id ( die ja auch uniqe is, also primschlüssel ), ned einfach in die tabelle squads dazu eintragen und dann die einfach wieder auslesen?

des mit intersection muss ich mir noch erarbeiten, des is bahnhof atm für mich :D

rettich

Legend
waffle, waffle!
Avatar
Registered: Jan 2004
Location: wien
Posts: 794
Zitat von moidaschl
wieso ned einfach, wenn einer hinzugefügt wurde, die spieler-id ( die ja auch uniqe is, also primschlüssel ), ned einfach in die tabelle squads dazu eintragen und dann die einfach wieder auslesen?

wie soll das gehen? in einer table "squads" hast du 2 spalten. squad_id und squad_name. wo willst das was dazu eintragen?

get yourself some intersection tables.

moidaschl

Vollzeit-Hackler
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
stimmt, funkt ned recht scheid :D

edit:

hat wer eine ahnung, wo ich des am gscheitesten nachlesen kann mit der Join syntax? find nur

http://dev.mysql.com/doc/mysql/de/JOIN.html

und kann des da ned gscheit rauslesen.. im php q-net is auch nix darüber :rolleyes:

thx
Bearbeitet von moidaschl am 02.12.2004, 19:36

moidaschl

Vollzeit-Hackler
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
pff oke solved, big thx leutz

der vollständigkeit halber der source:

Code: PHP
$sql = "SELECT 
          p.Name
        FROM players p, players_teams pt
        WHERE pt.Team_ID = '1';";
$result = mysql_query($sql) OR die(mysql_error());
if(mysql_num_rows($result)) {
   while($row = mysql_fetch_assoc($result)) {
    echo $row['Name'];
   }
}

ich hab jetz nurmal als test dem squad "männer" die ID 1 gegeben und den user "hans" dort reingeschrieben.

und ich bekomm hans als ausgabe :)


allerdings muss ich ja dann, wenn ich die leute adde zwei einträge erstellen, wenn ich den spieler in 2 teams haben will oder?
Bearbeitet von moidaschl am 02.12.2004, 20:19

moidaschl

Vollzeit-Hackler
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
OKE also i hab doch was verhaut, und i check genau _nix_ mehr :D

also

Code: PHP
  $sql = "SELECT 
            p.Name
          FROM players p, players_teams pt
          WHERE pt.Team_ID = '1';";
  $result = mysql_query($sql) OR die(mysql_error());
  if(mysql_num_rows($result)) {
     while($row = mysql_fetch_assoc($result)) {
           echo $row['Name'];            
     }
  }

so such ich mir den Namen raus.

ich hab da jetz 3 Tabellen, so wie ihr oben gschrieben habts

1) players, mit unter anderem eben Name, welches ich oben auslese

2) players_teams mit
ID ( prim. key )
Player_ID
Team_ID

3) teams mit
ID
Name

so nun müsste ich ja eigentlich in den
players_teams immer einen eintrag hinzufügen
zb:

Player_ID 1
Team_ID 1

für einen Spieler mit seinem prim.schlüssel 1
und das Team mit der ID 1 ( also auch prim.schlüssel )

genau so einen eintrag hab ic jetz drinnen
und 5 leute in den players.

nur wenn ich in players_teams 5 einträge erstell, was ich ja müsste
1 & 1, 1 & 2, 1 & 3, 1 & 4, 1 & 5 ... dann is es ihm egal was ich da schreib, er gibt mir einfach alle namen 5x aus.. wenn ich nur bis 1 & 4 geb gibt er mir alle namen 4x aus..

wo liegt mein denkfehler? find erm ned

thx

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
weil du einen full-join machst (ich glaub so heisst das...) dh. mysql gibt die jede mögliche kombination aus den 2 gegebenen tables mit den werten, die du per where ausgewählt hast. dein query müsste so irgendwie in der art aussehn...

Code:
SELECT
 p.Name
FROM players p
LEFT JOIN players_teams pt
 ON p.Player_ID=pt.Player_ID
WHERE pt.Team_ID = '1'

moidaschl

Vollzeit-Hackler
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
funkt! big thx, jetz hab ichs auch gschnallt :)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz