Datenbank mit meheren Tabellen.

Agent00

Grünschnabel
Hallo Leute,

habe da nen Problem oder Denkspeere ;-)

Also habe eine Datenbank :

DATENBANK ---- (mit Tabellen) ---> villages + ally + conquer + profile + tribe

Inhalt der Tabellen :

villages : id, name, x, y, tribe, points, rank
ally : id, name, tag, members, villages, points, all_points, rank
conquer : villages_id, unix_timestamp, new_owner, old_owner
profile : tribe_id, gb, geschlecht, ort, text, pic
tribe : id, name, ally, villages, points, rank

PHP:
<?php
include "config.inc.php";

if (!$connect) {
        die('keine Verbindung moeglich: ' . mysql_error());
        echo "Verbindung fehlgeschlagen";
}

if (!$db_selected) {
    die ('Kann bitscript nicht benutzen : ' . mysql_error());
        echo "DB kann nicht gewaehlt werden";
}
echo "<h1>DB wird gelesen und XML kreiert für Allgemeine Adelungen </h1><p><p>";
$connect = 'SELECT villages_id, unix_timestamp, new_owner, old_owner FROM dsconquer';
$result = mysql_query("SELECT * FROM dsconquer");
if (!$result) {
    die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
$num = mysql_num_rows($result);
echo 'Die Ergebnistabelle besitzt $num'." Datensätze<br />\n";
# das klappt soweit und bekomme die Anzahl der datensätze

while ($dsatz = mysql_fetch_assoc($result))

echo $dsatz["villages_id"] ."/n".$dsatz["unix_timestamp"]."/n". .....; #gibt mir das aus der Tabelle optimal aus möchte aber gern die namen nicht die id's

?>

^^ Kleiner Auszug aus meiner Abfrage , nun zur Frage da die Tabelle dsconquer alles ID's enthält und die Namen in den anderen Tabellen untergekommen ist wollte ich Fragen wie ich an die Namen der ID's in den anderen Tabellen komme ? Ich weiß das man if anweisungen verschachteln kann nur weiß jetzt nicht wie ich das umbauen muß damit das Funktioniert. Nächste Frage ist glaub simpler natur unix_timestamp in unser Zeitformat umwandeln .

Wollte Anschließend die Ausgabe in einer XML Datei unterbringen mit Filehandler.

Wenn mir jemand zumindest nen Beispiel geben könnte als denkanstoß wäre ich froh.

Danke und Mfg Agent00
 
Hallo,

Dass er dir den Namen und nicht die ID der Village ausgibt kann man zum Beispiel mit JOINs erreichen. Folgendes Beispiel sollte seinen Dienst nach deinen Vorstellungen erledigen (falls ich dir richtig verstanden habe ;):

SQL:
SELECT 
  c.villages_id,
  v.name,
  c.unix_timestamp, 
  c.new_owner, 
  c.old_owner 
FROM 
  conquer c JOIN  villages v ON c.villages_id = v.id;

Die Ausgabe des Unixtimestamps im deutschen Datumsformat erreichst du entweder über MySQL direkt oder (wie ich bevorzuge) per PHP;

PHP:
echo date("d.m.Y", $dsatz['unix_timestamp']);

Das gibt dir das Datum im Format "TT.MM.JJJJ" aus.


// Edit:
Warum weißt du eigentlich der $connect eine SQL-Abfrage zu, welche du nicht ausführst?

Ausserdem dürfte die Zeile
PHP:
echo 'Die Ergebnistabelle besitzt $num'." Datensätze<br />\n";
nicht das gewünschte Ergebnis ausgeben, da immer $num, und nicht der Wert von $num ausgegeben wird.
Wenn du das ganze allerdings anders quotest, dann sollte es gehen:
PHP:
echo "Die Ergebnistabelle besitzt " . $num . " Datensätze<br />\n";


Referenzen:
MySQL: JOIN
PHP: date()

Gruß
Bratkartoffel
 
Zuletzt bearbeitet:
Ähm ich zeig mal was ich meine an einem Dump damit du siehst was in den Tabellen genau drin steht.

villages : id, name, x, y, tribe, points, rank
Code:
1,%2A%2A1,537,587,498771,10195,0
2,%5B017%5D+Franken,492,534,1392382,10000,3
3,-50-+Memphis,446,556,663542,9613,0
4,15+Hochlitten,472,537,391490,6725,0
5,%7C022%7C+WeS,523,392,632278,10068,2
6,K%C3%B6ln+012,499,491,1918860,9581,0

tribe : id, name, ally, villages, points, rank
Code:
1482575,ReservoirDOG,3727,15,136204,2630
1399397,SECMAN,0,1,1714,11687
1679325,Sadis,331,180,1675533,7
1911736,K%C3%B6nig+Robhar,22716,61,621681,364
993622,Sharkey,71,20,197015,1887
1041361,Amadea05,0,0,0,21252
497428,Carpaso,8592,121,1152014,62
1461635,Pierre3108,0,1,1115,12863

ally : id, name, tag, members, villages, points, all_points, rank
Code:
21274,DerAnimeAdel,-DAA-,9,9,12437,12437,715
25001,Phoenix,%7E%7EPH%7E%7E,4,9,20342,20342,649
25002,Stamm+der+Freiheit,-Sdf-,5,17,126900,126900,404
26503,Das+Marinehauptquartier,MHQ,2,2,2386,2386,1031
21083,Hannover96,Hi1896,1,1,3103,3103,971
25932,Alt+ef+Fear,AeF,1,1,402,402,1410
25934,Wing+of+Flies,W.O.F,5,7,19096,19096,658

profile : tribe_id, gb, geschlecht, ort, text, pic
Code:
1482575,0000-00-00,,
1399397,0000-00-00,,
1679325,1972-04-21,m,M%C3%BCnchen
1388708,0000-00-00,,
1304318,0000-00-00,,
1911736,1995-10-03,m,Freiburg+im+Breisgau

conquer : villages_id, unix_timestamp, new_owner, old_owner
Code:
2769,1213635668,872637,1209073
76676,1213654899,1188244,1206114
40222,1213682242,456723,0
17310,1213685268,1752219,1855084
19906,1213704788,357613,1777068
9980,1213738558,1849235,0
25358,1213781783,1287000,0

Zeile 1 aus conquer hat gesagt.:
2769,1213635668,872637,1209073

2769 = villages_id , diese muß in tabelle village gesucht werden und der name ausgegeben werden

1213635668 = Unix_timestamp , geklärt

872637 = id des alten nutzers , der name steht in tribe

1209073 = id des neuen nutzers auch wieder aus tribe ziehen
 
Also,

habe mir das ganze mal als relationales Diagramm aufgezeichnet. Wenn ich die Daten richtig gedeutet habe, dann heißt das, dass in der Tabelle conquer

1. statt "villages_id" der Name von "villages" ausgegeben werden soll; conquer.villages_id=villages.id
2. statt "new_owner" der Name von "tribe" ausgegeben werden soll; conquer.new_owner=tribe.id
3. statt "old_owner" der Name von "tribe" ausgegeben werden soll; conquer.old_owner=tribe.id

Falls meine Überlegungen soweit stimmen, dann kannst du das eh so ähnlich machen, wie ich dir geschrieben habe, mit JOINs und SubQueries.

Weil ich jetzt einfach zu müde bin, weiter Tips zu geben, hier mal eine Lösung von mir ;):

SQL:
SELECT
  v.name,
  c.unix_timestamp,
  (
    SELECT
      t.name
    FROM
      tribe t
    WHERE
      t.id=c.new_owner
  ) AS new_owner,
  (
    SELECT
      t.name
    FROM
      tribe t
    WHERE
      t.id=c.old_owner
  ) AS old_owner
FROM
  conquer c JOIN villages v ON c.villages_id=v.id

ungetestet, kann funktionieren, muss aber nicht ;)
Also ungetestet im Sinne von "ohne Daten". Syntaktisch ist die Query OK. Musst halt mit Daten testen.

Gruß
Bratkartoffel
 
Zuletzt bearbeitet:
Ah so meintest du das ... ok danke werde ich testen sobald mein neues Modem vom Anbieter endlich läuft ... bekomme von heute auf morgen kein dsl signal mehr ...

Sage bescheid wennes geht.

Gruß
 
Zurück