SELECT * FROM zeiten, user WHERE zeiten.user = user.id;
aaalso ^^
das dbms soll nun alle daten (*) aus den tabellen zeiten und user raussuchen. soweit klar. mit der where bedingung wird dann allerdings sicher gestellt, dass uns nur die userdaten beim ergebnis angefügt werden, die auch der gegebenen id entsprechen - nämlich genau der id, die in zeiten angegeben ist. hier beispieltabellen:
zeiten
ID|Tätigkeit-ID|Produkt-ID|User-ID
1|3|2|5
2|3|1|4
3|1|1|2
user
ID|Name
1|Ulla
2|Boss3D
3|Heinz
4|Tessa
5|Mo
wenn wir einfach sagen "SELECT * FROM zeiten;", bekommen wir (mit jeder abfrage, $res würde 3 zeilen ausgelesen haben) sowas raus:
$row = { ['ID'] => 1, ['Tätigkeit-ID'] = 3, ['Produkt-ID'] = 2, ['User-ID'] = 5 };
$row = { ['ID'] => 2, ['Tätigkeit-ID'] = 3, ['Produkt-ID'] = 1, ['User-ID'] = 4 };
$row = { ['ID'] => 3, ['Tätigkeit-ID'] = 1, ['Produkt-ID'] = 1, ['User-ID'] = 2 };
wenn wir diesen zahlensalat ausgeben, ist das zwar "syntaktisch" richtig, aber "semantischer" kauderwelsch ^^ daher holen wir uns also bspw noch die userdaten, und damit da nich alles mit allem gemixt wird, machen wir das NICHT bedingungslos. wir wollen für eine zeitenzeile NUR die userzeilen daten anfügen, die wir brauchen -> "SELECT * FROM zeiten, user WHERE zeiten.User-ID = user.ID;". ergebnis:
$row = { ['ID'] => 1, ['Tätigkeit-ID'] = 3, ['Produkt-ID'] = 2, ['User-ID'] = 5, ['Name'] = 'Mo' };
$row = { ['ID'] => 2, ['Tätigkeit-ID'] = 3, ['Produkt-ID'] = 1, ['User-ID'] = 4, ['Name'] = 'Tessa' };
$row = { ['ID'] => 3, ['Tätigkeit-ID'] = 1, ['Produkt-ID'] = 1, ['User-ID'] = 2, ['Name'] = 'Boss3D' };
wir sehen: nun haben wir zusätzlich die Name-spalte aus der user-tabelle. was wir jetzt hier nich so genau sehen: user und zeiten haben BEIDE eine spalte ID - wie mysql das hier im speziellen löst, weis ich leider nicht :/ eventuell nennt es die dinger in zeiten.ID um und fügt user.ID an - aber ich glaube, als ich das mal probiert hatte, funzte das nich. daher immer aufpassen, wenn ihr gleiche spaltennamen habt. notfalls müsst ihr die dann "umbenennen". zum bsp so hier:
"SELECT T1.Beispiel AS bla, T2.Beispiel AS blubb FROM table1 AS T1, table2 AS T2... ;"
auch hier hat man in beiden tabellen table1 und table2 jeweils eine spalte Beispiel, benennt diese aber jetzt jeweils um. in unserem row könnte man also nun mittels $row['bla'] auf table1.Beispiel zugreifen und mit $row['blubb'] auf table2.Beispiel. was man auch sieht: diese "aliases" kann man auch im sql string selbst verwenden. in der from-clausel gebe ich den tabellen die alias-namen T1 und T2 und spare mir in der select clausel damit schreibarbeit (statt table1 einfach T1 geschrieben). wenn man dann noch häufiger in der where clausel oder beim sortieren oder so den tabellen namen braucht, dann macht sich das bemerkbar ^^
nachteil: da man nich simpel * abfragt, also alles, muss man explizit alles angeben, was man braucht.
für unser bsp ist das aber erstmal zweitrangig, da uns die ID hier nen feuchten juckt ^^ wir könnten jetzt also schonmal den user-namen statt der id ausgeben lassen (statt $row['User-ID'] lassen wir eben $row['Name'] ausgeben), die tätigkeiten und produkte sind aber immernoch nur nummern. aber das können wir da ganz genauso machen:
"SELECT * FROM zeiten AS z, user AS u,
tätigkeiten AS t, produkte AS p WHERE z.User-ID = u.ID
AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID = p.ID;"
*tadaa*
falls wir das problem haben, dass bei produkte und tätigkeiten die string-variante in der gleichnamigen spalte Bezeichnung liegt, dann können wir unser vorhandenes wissen jetzt produktiv nutzen:
"SELECT
t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p WHERE z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID = p.ID;"
eine ausgabe könnte dann in etwa so aussehen:
echo '<tr><td>'.$row['tBez'].'</td><td>'.$row['pBez'].'</td><td>'.$row['uName'].'</td></tr>';
will man nur die daten, die von enem betimmten user sind, dann muss man das ganze so verfeinern:
"SELECT t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p WHERE z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID = p.ID
AND z.User-ID = '".$aktueller_user."';"
will man weiterhin nur die daten in einem bestimmten zeitraum, dann kann das ganze so aussehen (das bsp müsste jetzt natürlich erweitert werden um die datum-spalte):
"SELECT t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p WHERE z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID = p.ID AND z.User-ID = '".$aktueller_user."'
AND z.Datum > '".$wochenanfang."' AND z.Datum <= '".$wochenende."';"
dazu wäre es aber sinnvoll und mMn einfacher, wenn man Datum als konstruierten timespamp (mktime() oder wie es hieß) speichert. also generell ein datums format der db, das man selber nachgebildet bekommt ^^ dann baut man sich eine funktion, die die aktuelle woche ermittelt (als zahl - wir sind jetzt gerade zum bsp in KW 28 ^^). vllt gibts die ja sogar schon von php aus. und dann baut man sich noch ne funke, die für eine kalenderwoche deren anfangs- und end-timestamp ermittelt. genau diese beiden werte werden dann an die db übergeben - das was ich hier oben fett markiert hatte zuletzt. sinn des ganzen: ich würde noch buttons anlegen, die eine woche vor und eine zurück "spulen" - ergo einfach die zahl der kalenderwoche incrementieren oder decrementieren. woche zurück button -> aus der 28 wird ne 27. die funktion, die uns die timestamps baut bekommt nun die 27 zum fressen und spuckt dementsprechend die zeiten der woche 27 aus, und nicht die der 28 und schwupps, wird unsere tabelle mit den daten der letzten woche aufgebaut. usw usf.
weiteres problem: ich gehe gerade davon aus, dass wir pro datum eine zeile in der db anlegen. also einen eintrag eben. wenn man in einer woche 3mal an einer tätigkeit/produkt-kombi gewerkelt hat, steht das in deiner exeltabelle alles in einer zeile. so wie ICH das lösen würde, würden aber jetzt dafür 3 zeilen in der tabele ausgegeben werden, eben weil wir 3 db-einträge vorgenommen haben. wir müssten die dann also am besten noch zusammenfügen. dafür würde ich unser ergebnis der db-anfrage noch sortieren. zuerst nach tätigkeiten, dann nach produkten. dann kann man davon ausgehen, das immer, wenn das produkt wechselt, man auch eine neue zeile beginnen kann. das ist natürlich ein kniffliger part und schwer zu beschreiben. aber vllt wisst ihr, was ich meine. unsere anfrgae müsste dann also so lauten:
"SELECT t.Bezeichnung AS tBez, p.Bezeichnung AS pBez, u.Name AS uName FROM zeiten AS z, user AS u, tätigkeiten AS t, produkte AS p WHERE z.User-ID = u.ID AND z.Tätigkeit-ID = t.ID AND z.Produkt-ID = p.ID AND z.User-ID = '".$aktueller_user."' AND z.Datum > '".$wochenanfang."' AND z.Datum <= '".$wochenende."
ORDER BY z.Tätigkeit-ID ASC, z.Produkt-ID ASC';"
hier kannste probieren, ob dir ASC oder DESC besser gefällt. ist die sortierreihenfolge ^^ ASC ist default und kann daher auch weggelassen werden.