PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zur Abfrageverschachtelung - Logikfrage!


ljungi
25.11.2005, 17:45
Hallo,

ich hab mal eine Frage, die nix mit dem vB zu tun hat, aber was mit PHP ^^

Erst mal Sorry für den langen Text... Hoffe ihr plant das, wenn nicht bitte nachfragen, mir ist die Sache sehr wichtig!

Folgende Struktur der Datenbank:

Tabelle Fertig
--------------------------------
| id | fertig_seit | fertig_id |
|----|-------------|-----------|
| 1 -| timestamp --|--- 1 -----|
| 2 -| timestamp --|--- 2 -----|
| 3 -| timestamp --|--- 5 -----|
...

Tabelle Weiter
--------------------------------
| id | benoetigt | ... ....
|----|-----------|
| 1 -| --- 1 ----|
| 2 -| - 1,2,5 --|
| 3 -| 1,3,5,7,10|
...

Nun will ich das so machen, dass nur die Werte ausgeben werden, die auch tatsächlich schon erarbeitet wurden. Zum Beispiel soll man nun mit den id's 1,2 und 5 den Wert aus der Spalte 1 und 2 sehen, da dort genau diese Zahlen auftreten. Nur bei 3. geht das noch nicht, da noch "fremde" Zahlen zu finden sind.

Hoffe ich hab das Problem einigermaßen genau geschildert...

Ich hab schon X versuche gestartet.. Mein aktuellster Versuch:

$_check = $db->query("SELECT * FROM Fertig WHERE userid = '".$_user['id']."'")or die(mysql_error());
$k = 0;
while($test = $db->fetchArray($_check)) {
$k++;
if($k <= 1) {
$explodeteststring = "";
}else {
$explodeteststring .= ",";
}
$explodeteststring .= $test['fid'];
// echo "Explodeteststring: ".$explodeteststring."<br>";
}

So packe ich alle Werte aus der Fertig in einen String, wobei die Werte durch ein Komma getrennt sind.

Dann weiter:

$_query = $db->query("SELECT * FROM weiter")or die(mysql_error());
while($f = $db->fetchArray($_query)) {
$show = 0;
if($f['benoetigt'] == 0 || empty($f['benoetigt'])) $jump = 1;
$treffer=preg_match("/,/", $f['benoetigt']);
echo $f['benoetigt'];
// echo "Treffer: ".$treffer."<br>";
if($treffer != 0) {
echo "inTrefferDrin";
$benoetigt = explode(",",$f['benoetigt']);
$explodeid = explode(",",$explodeteststring);
foreach ($benoetigt as $value) {
if($value == $explodeid){
$show = 1;
}else {
$show = 0;
}
}
}else {
// echo "In Else von Treffer<br/>";
echo "Explodetest ".$explodeteststring."<br>";
$explodeteststringtest = preg_match("/,/", $explodeteststring);
echo "Explodetest preg match result: ".$explodeteststringtest."<br>";
$explodeit = $explodeteststring;
if($explodeteststringtest != 0) {
$explodeteststring = explode(",",$explodeit);
foreach ($explodeteststring as $value) {
echo "Akt Wert von value: ".$value."<br>";
echo "Akt Wert von fbenoetigt: ".$f['benoetigt']."<br>";
if($value == $f['benoetigt']){
$show = 1;
}else {
$show = 0;
}
}
echo "Variable show1: ".$show."<br>";
}else {
echo "In Else von Explodeteststringtest<br/>";
echo "Akt Wert von fbenoetigt: ".$f['benoetigt']."<br>";
if($explodeit == $f['benoetigt']){
$show = 1;
}else {
$show = 0;
}
echo "Variable show: ".$show."<br>";
}
}


Leider geht das nicht... Es werden dennoch alle Werte aus "Weiter" ausgegeben!

Hier die Ausgabe der echo's ist folgende...
Es gibt zwei Datensätze in "weiter", einen in "Fertig":

Explodetest 1
Explodetest preg match result: 0
In Else von Explodeteststringtest
Akt Wert von fbenoetigt:
Variable show: 0

1Explodetest 1
Explodetest preg match result: 0
In Else von Explodeteststringtest
Akt Wert von fbenoetigt: 1
Variable show: 1

Mystics
26.11.2005, 21:33
Kannst du das Beispiel nochmal deutlicher machen?Zum Beispiel soll man nun mit den id's 1,2 und 5 den Wert aus der Spalte 1 und 2 sehen, da dort genau diese Zahlen auftreten. Nur bei 3. geht das noch nicht, da noch "fremde" Zahlen zu finden sind.
Welche IDs sind 1, 2 und 5? Fertig? Weiter? In deiner Beispiel Fertig Tabelle gibt es auch kein Feld userid. Und was meinst du mit Spalte 1 und 2? Meinst du die Reihen 1 und 2 aus der Tabelle Fertig?Es gibt zwei Datensätze in "weiter", einen in "Fertig":Und welche sind das? Deine echo Ausgabe stimmt nicht mit deinem Tabellenbeispiel überein...das macht die ganze Sache noch komplizierter zu verstehen.

Und dass er beide Sachen ausgibt, ist laut deinem Code auch so beabsichtigt. Es ist doch nur wichtig, welchen Wert die $show Variable hat. Und die ist nur einmal auf 1 gesetzt....also sollte es doch passen?

Es fehlt doch nur noch am Ende eine Bedingung:

if ($show == 1)
{
// display
}

ljungi
27.11.2005, 14:03
Hallo,


also ich hab das nun mit den 5 Normalformen bei Datenbanken gelernt und folgende Tabellen erstellt (vereinfacht, manche Felder weggelassen!)


Fertig
-------------------------------
| id | fertig_seit | fertig_id | userid
|----|-------------|------| ------
| 1 -| timestamp --|--- 1 -| 1
| 2 -| timestamp --|--- 2 -| 1
| 3 -| timestamp --|--- 3 -| 1


Benoetigt
--------------------------------
| id | weiter_id | fertig_id -|
|----|---------|----------|
| 1 -| --- 2 ---|--- 1 -----|
| 2 -| --- 3 ---|--- 2 -----|
| 3 -| --- 4 ---|--- 1 -----|
| 4 -| --- 4 ---|--- 3 -----|
| 5 -| --- 5 ---|--- 4 -----|
| 6 -| --- 5 ---|--- 6 -----|
| 7 -| --- 6 ---|--- 2 -----|


Weiter
--------------------------------
| id | name | beschreibung -|
|--- |---------|----------|
| 1 -| --- test ---|--- nurn test -----|
| 2 -| --- name2 ---|--- besch -----|
| 3 -| --- name3 ---|--- ad -----|
| 4 -| --- name4 ---|--- zea -----|
| 5 -| --- name5 ---|--- ew -----|
| 6 -| --- name6 ---|--- ole -----|



Nun geht es darum, dass aus der Tabelle "Weiter" nur die Werte angezeigt werden, deren "Benoetigt"e Bedingungen schon erfüllt wurden. Diese Bedingungen stehen in der Tabelle "Fertig". Hat also nun in diesem Beispiel User 1 die Bedingungen 1,2,3 erfüllt, so dürfen laut "Benoetigt" nur die Werte mit der ID 1 - 4 aus "Weiter" ausgegeben werden.

Es ist schwer zu formulieren, ich hoffe, dass ihr das trotzdem versteht!

Ich habe das so gedacht:

Erst lese ich alle Werte aus "Fertig" aus, die dem User angehören. Dann überprüfe ich, ob die Werte in "Benoetigt" vorkommen. Danach muss ich überprüfen ob die "weiter_id" mehrmals in der Tabelle "Benoetigt" vorkommt.

Dann kommt der Widerspruch, dass ich danach ja noch einmal überprüfen muss, ob die benötigten "fertig_id's" auch vorhanden sind.

Danach muss ich nur noch alle Werte aus Weiter auslesen, wo die id == weiter_id.


Update...

Hier der Code

$c = $db->query("SELECT m.id AS a_fid, m.fertig_id, v.id AS f_fid, v.fertig_seit FROM Fertig v LEFT JOIN Benoetigt m ON v.id = m.fertig_id && v.fertig_seit <= ".time()."")or die(mysql_error());
//Um zu umgehen, dass die ID 0 sein kann...
if($db->numRows($c) <= 0) {
$db->query( "INSERT INTO `Fertig` (`id`, `fertig_id`, `fertig_seit`, `userid`) VALUES ('','1', '1', '".$_user['id']."')");
}
while($d = $db->fetchArray($c)) {
$e = $db->query("SELECT * FROM Benoetigt WHERE fertig_id = '".$d['a_fid']."'")or die(mysql_error());
if($db->numRows($e) > 1) {

}else {
$q = $db->query("SELECT * FROM Weiter WHERE id = '".$d['a_fid']."'")or die(mysql_error());
while($f = $db->fetchArray($q)) {
//AUSGABE...


Nur gibt er nun alles aus, was auch nur einmal vorkommt. Er checkt also nicht, ob eine Weiter_id mehrere Fertig_id's braucht.


Anmerkung: Es gibt keine Mysql_errors, kann sein, dass sich hier einige beim Übertragen und verändern der Namen eingeschlichen haben!

Grüße
ljungi