PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   Abfrage, welche sich auf eine andere bezieht (http://www.selfphp.de/forum/showthread.php?t=24719)

Max 16.08.2012 16:29:25

Abfrage, welche sich auf eine andere bezieht
 
Hallo erstmal zusammen,
wie vermutlich fast jeder hier, habe ich mich hier registriert, weil ich ein Problem habe, welches ich alleine anscheinend nicht lösen kann.

Dann gleich mal zu dem Problem:
Ich habe 4 Tabellen.
tbl_spieler (s_id, s_name, s_alter, n_id_f)
tbl_bilder (b_id, b_link, s_id_f)
tbl_nation (n_id, n_nation)
tbl_vereine (v_id, v_verein, s_id_f2)

Ich würde jetzt gerne mittels php eine Seite erstellen, die mir eine Liste aller Spieler untereinander ausgibt. Dort zu sehen ist ein Bild, der Name und das Alter des Spielers. Das klappt auch alles wunderbar. Allerdings möchte ich neben jedem Spieler noch ne Liste, in der seine bisherigen Vereine angezeigt werden. Also quasi ein Endlosunterformular in einem Endlosformular. Das klappt leider nicht. Wo mache ich die Verbindung zwischen den beiden Abfragen oder geht das einfach nicht???

Hier mal der Code:

PHP-Code:

<?
$ergebnis = mysql_query("SELECT b_link, s_id, s_name, s_alter, n_nation
FROM tbl_spieler, tbl_nation, tbl_bilder
WHERE n_id = n_id_f
AND s_id = s_id_f
GROUP BY s_id_f");

$ergebnis2 = mysql_query("SELECT s_id, v_verein
FROM tbl_spieler
INNER JOIN tbl_vereine ON s_id = s_id_f2");

while($row = mysql_fetch_object($ergebnis))
{
  echo '<a href=spielerdetails.php?s_id='.$row->s_id.'><img class="images" src="'.$row->b_link.'" alt="" width="250" height="168"></a>';
  echo '<a href=spielerdetails.php?s_id='.$row->s_id.'>'.$row->s_name.'</a>';
  echo '<p>('.$row->n_nation.")</p>";
  while($row = mysql_fetch_object($ergebnis2))
  {
    echo '<p>'.$row->v_verein."</p>";
  }
}

?>

Kann mir vielleicht jemand irgendwie helfen?

VG Max

raiguen 21.08.2012 17:28:06

AW: Abfrage, welche sich auf eine andere bezieht
 
Zitat:

Das klappt leider nicht.
*räusper* Ist mal wieder ein typischer alles-und-nichts-sagender Hinweis!

Aber... beim Blick auf die beiden Statements würde ich sagen, dass Du AUCH im 2.Statement ALLE Spieler mit den zugehörigen Vereinen 'sammelst'. Soweit so gut, ABER: in der 2.WHILE-Schleife gibst Du dann auch ALLE Spieler/Vereine aus, OHNE auf den jeweiligen (in der 1.WHILE-Schleife) gerade anzuzeigenden Spieler zu achten! Mit anderen Worten: jeder Spieler hat ALLE (auch ihm nicht zugehörige Vereine) in der Auflistung.

Zitat:

Wo mache ich die Verbindung zwischen den beiden Abfragen...???
Na? Klickerts? Du musst in der zweiten WHILE-Schleife schon auf die gerade 'aktuelle' SpielerID reagieren!

Wie Du das machen willst/möchtest, bleibt Deiner Wahl überlassen. Evtl. das 2.Abfrageergebnis als Array speichern und wenn möglich, jeweils mit der entsprechenden SpielerID filtern und dann mittels WHILE ausgeben. Aber für PHP-technische sind die anderen gefragt - ist derzeit nicht meine Baustelle.

Max 22.08.2012 13:04:36

AW: Abfrage, welche sich auf eine andere bezieht
 
Hallo raiguen,

erstmal vielen Dank für deine Antwort.

Zitat:

*räusper* Ist mal wieder ein typischer alles-und-nichts-sagender Hinweis!
Mit klappt leider nicht, meinte ich, dass mir nur beim ersten Spieler in der Liste alle (also auch die, bei denen er gar nicht gespielt hat) Vereine angezeigt werden.

Du hast natürlich absolut recht, ich muss irgend wie überprüfen, ob die ID´s gleich sind, so dass er nur die entsprechenden Vereine ausgibt.

Aber wie genau mache ich das in meinen SELECT-Statements?

Zitat:

Wie Du das machen willst/möchtest, bleibt Deiner Wahl überlassen. Evtl. das 2.Abfrageergebnis als Array speichern und wenn möglich, jeweils mit der entsprechenden SpielerID filtern...
Kannst du bzw. jemand anderes mir vielleicht ein Tipp oder Link oder so geben, wie ich so etwas machen muss?

VG Max

Ckaos 25.08.2012 09:53:49

AW: Abfrage, welche sich auf eine andere bezieht
 
Hi

Zitat:

Zitat von Max (Beitrag 143598)
Kannst du bzw. jemand anderes mir vielleicht ein Tipp oder Link oder so geben, wie ich so etwas machen muss?

1. Es ist völlig sinnfrei in einer verschachtelten while - Schleife erneut $row zu benutzen.
2. Sollte man sich vorher beim Tabellendesign gedanken machen was man später in welchem Zusammenhang braucht. Nicht einfach alles tot-Normalisieren und später wundern das man schlechte Abfragezeiten erreicht!

Zitat:

Wie Du das machen willst/möchtest, bleibt Deiner Wahl überlassen. Evtl. das 2.Abfrageergebnis als Array speichern und wenn möglich, jeweils mit der entsprechenden SpielerID filtern und dann mittels WHILE ausgeben
Richtig es gibt mehrere ansätze dazu z.B.:
1.
PHP-Code:

while($row mysql_fetch_object($ergebnis))
{
  echo 
'<a href=spielerdetails.php?s_id='.$row->s_id.'><img class="images" src="'.$row->b_link.'" alt="" width="250" height="168"></a>';
  echo 
'<a href=spielerdetails.php?s_id='.$row->s_id.'>'.$row->s_name.'</a>';
  echo 
'<p>('.$row->n_nation.")</p>";
$ergebnis2 mysql_query("SELECT s_id, v_verein
FROM tbl_spieler
INNER JOIN tbl_vereine ON s_id = s_id_f2 where s_id='"
.$row->s_id."'");
  while(
$subrow mysql_fetch_object($ergebnis2))
  {
    echo 
'<p>'.$subrow ->v_verein."</p>";
  }


2.
PHP-Code:

$ergebnis2 mysql_query("SELECT s_id, v_verein
FROM tbl_spieler
INNER JOIN tbl_vereine ON s_id = s_id_f2"
);
//Speichern aller vereine anhand s_id
while($subrow mysql_fetch_object($ergebnis2))$s_ids[$subrow->s_id][]=$subrow->v_verein;
while(
$row mysql_fetch_object($ergebnis))
{
  echo 
'<a href=spielerdetails.php?s_id='.$row->s_id.'><img class="images" src="'.$row->b_link.'" alt="" width="250" height="168"></a>';
  echo 
'<a href=spielerdetails.php?s_id='.$row->s_id.'>'.$row->s_name.'</a>';
  echo 
'<p>('.$row->n_nation.")</p>";
  
//hat er vereine?
  
if(isset($s_ids[$row->s_id])){
    echo 
'<p>'.implode(',',$s_ids[$row->s_id])."</p>";
  }else{
    echo 
"nö";
  }
  }


Nachteil der ersten variante bei jedem Spieler wird eine weitere SQL Abfrage abgesetzt.
Natürlich kannst du auch alles in einer Abfrage abfangen und dann die Rückgabe wie "raiguen" schon sagte in ein Array packen und dann das array durchgehen.

Denke hast nun genug ansätze.

mfg

CKaos


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:11:39 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.