heinetz: MySQL Statement

Hallo Forum,

mir fehlt so ein bisschen die Idee, wie ich eine Aufgabe rein
mit SQL lösen kann, die ich bisher mit PHP gelöst habe. Aber
vielleicht geht's ja doch.

Meine MySQL-Tabelle 'content':

  
   id |  titel |   uebrschrift |   text |    r_id  
------+--------+---------------+--------+--------  
    1 |     A  |     header a  | text a |       0  
------+--------+---------------+--------+--------  
    2 |     B  |     header b  | text b |       0  
------+--------+---------------+--------+--------  
    3 |     C  |     header C  | text c |       2  

Ich lese den Datensatz mit php aus:

  
$mysqlStatm = "  
SELECT *  
FROM `content`  
WHERE `content`.`id`= '1'";  
$mysqlReslt  = mysql_query($mysqlStatm);  
$mysqlResltA =  mysql_fetch_assoc($mysqlReslt);  

... und die Werte in einem assoziativen Array
vorliegen:

  
echo $mysqlResltA['id'];  
//Ausgabe: 1  

Intereesant dabei ist das Feld 'r_id', dass im
Datensatz mit der 'id' 3 ungleich 0 ist. Damit
gehe ich zur zeit so um:

  
  
$mysqlStatm = "  
SELECT *  
FROM `content`  
WHERE `content`.`id`= '3'";  
$mysqlReslt  = mysql_query($mysqlStatm);  
$mysqlResltA =  mysql_fetch_assoc($mysqlReslt);  
  
if ($mysqlResltA['r_id']!=0)  
  {  
   $mysqlStatm = "  
   SELECT  
   `uebrschrift`,  
   `test`  
   FROM `content`  
   WHERE `content`.`id`= ".$mysqlResltA['r_id'];  
   mysql_select_db($db1Name);  
   $mysqlReslt = mysql_query($mysqlStatm);  
   $mysqlResltA2 = mysql_fetch_assoc($mysqlReslt);  
   for (reset($mysqlResltA2);$key=key($mysqlResltA2);next($mysqlResltA2))  
      {  
       $mysqlResltA[$key] = $mysqlResltA2[$key];  
      }  
  }  

und erreiche so, dass einige Werte in meinem assoziativen
Array überschieben werden, wenn die 'r_id' ungeleich 0 ist.

  
echo $mysqlResltA['id'];  
//Ausgabe: 3  
echo $mysqlResltA['text'];  
//Ausgabe: text b  

Diese PHP-Prozedur würde ich gerne abschaffen und das ganze
in einem SQL-Statement definieren. Ich habe folgendes
versucht:

  
  
$mysqlStatm = "  
SELECT  
`content`.*,  
r.`uebrschrift`,  
r.`text`  
FROM `content`  
LEFT JOIN `content` AS r ON `content`.`r_id` = r.`id`  
WHERE `content`.`id`= '3'";  
$mysqlReslt  = mysql_query($mysqlStatm);  
$mysqlResltA =  mysql_fetch_assoc($mysqlReslt);  

Das funktioniert für 3 auch. Die Felder uebrschrift und
text sind so in dem Resultset zweimal mit dem selben Namen
vorhanden. Als erstens content.uebrschrift und als zweites
r.uebrschrift. Das führt dazu, dass durch:

  
$mysqlResltA =  mysql_fetch_assoc($mysqlReslt);  

... das Element $mysqlResltA['uebrschrift'] zwiemal belegt
wird. Beim ersten Mal mit dem Wert aus content.uebrschrift,
der dann durch den Wert aus r.uebrschrift überschrieben wird.

Genau so soll es sein !

Allerdings funktioniert das nicht mehr bei de Datensätzen 1 und 2.
Da wird das Element $mysqlResltA['uebrschrift'] auch zwiemal
belegt. Dummerweise ist der Wert aus r.uebrschrift aber dann
NULL ;(

Hat irgendwer eine Idee, wie ich das anders ohne PHP lösen kann ?

danke für Tipps und

beste gruesse,
heinetz

  1. yo,

    Allerdings funktioniert das nicht mehr bei de Datensätzen 1 und 2.
    Da wird das Element $mysqlResltA['uebrschrift'] auch zwiemal
    belegt. Dummerweise ist der Wert aus r.uebrschrift aber dann
    NULL ;(

    liegt in der natur der sache. aber welche werte sollten den da anstelle von NULL stehen, also was hättestr du dir gewünscht ?

    Ilja

    1. naja, dass die Werte nicht überschrieben werden ;)

      ich hatte die Logik ja urspünglich in PHP abgebildet.
      Daraus wird's klar:

        
      $mysqlStatm = "  
      SELECT *  
      FROM `content`  
      WHERE `content`.`id`= '3'";  
      $mysqlReslt  = mysql_query($mysqlStatm);  
      $mysqlResltA =  mysql_fetch_assoc($mysqlReslt);  
        
      // Mein $mysqlResltA ist nun ein eindimensionales assoziatives  
      // Array, in dem sämtliche Werte aus dem Datensatz mit der ID  
      // 3 stehen. Auf diese Werte greife ich so zu:  
        
      echo $mysqlResltA['uebrschrift'];  
      // Ausgabe: header C  
        
      echo $mysqlResltA['r_id'];  
      // Ausgabe: 2  
      
      

      Das Feld 'r_id' steht für Redundanz. Der Datensatz mit der ID 3
      soll mit dem Datenatz mit der ID 2 so verknüpft werden, dass
      bestimmte Werte des Datensatzes 3 mit Werten des Datensatzes 2
      überschrieben werden:

        
      if ($mysqlResltA['r_id']!=0)  
        {  
         $mysqlStatm = "  
         SELECT  
         `uebrschrift`,  
         `text`  
         FROM `content`  
         WHERE `content`.`id`= ".$mysqlResltA['r_id'];  
         mysql_select_db($db1Name);  
         $mysqlReslt = mysql_query($mysqlStatm);  
         $mysqlResltA2 = mysql_fetch_assoc($mysqlReslt);  
         for (reset($mysqlResltA2);$key=key($mysqlResltA2);next($mysqlResltA2))  
            {  
             $mysqlResltA[$key] = $mysqlResltA2[$key];  
            }  
        }  
        
      // In meinem $mysqlResltA sind nun die Werte für `uebrschrift`  
      // und `text` überschieben worden  
        
      echo $mysqlResltA['uebrschrift'];  
      // Ausgabe: header b  
      
      

      Klar ?

      Dieses optionale Überschreiben von Feldwerten habe ich versucht
      mit dem JOIN abzubilden. Dummerweise ist es dann aber garnicht
      optional ;(
      Das war mein Denkfehler. Klar. Ich kann mir aber vorstellen, dass
      es in MySQL etwas gibt, dass ich nicht kenne oder auf das ich
      einfach nicht komme, dass sich hervorragend eignet, um meine PHP-
      Kontruktion zu erstzen. Vielleicht lässt sich da z.B. mit isnull
      () etwas machen. Mir fehlt die Erfahrung mit MySQL und daher auch
      der zündenede Gedanke ...

      besten dank für Tipps und

      beste gruesse,
      heinetz

      1. yo,

        naja, dass die Werte nicht überschrieben werden ;)

        wenn ich dich richtig verstanden habe, willst du einen OUTER JOIN machen, und wenn es einen Datensatz gibt der im OUTER JOIN trifft, willst du zum beispiel an einer spalte diesen wert haben. Das geht recht einfach, zum beispiel mit einem CASE konstrukt. da prüfst du einfach, ob deine spalte r_id > 0 ist und wenn ja, nimmst du den wert aus der OUTER JOIN tabelle, ansonsten den alten.

        Ilja

        1. wenn ich dich richtig verstanden habe, willst du einen OUTER JOIN machen, und wenn es einen Datensatz gibt der im OUTER JOIN trifft, willst du zum beispiel an einer spalte diesen wert haben. Das geht recht einfach, zum beispiel mit einem CASE konstrukt. da prüfst du einfach, ob deine spalte r_id > 0 ist und wenn ja, nimmst du den wert aus der OUTER JOIN tabelle, ansonsten den alten.

          Klasse! danke für den Tipp!

          Obwohl ich es jetzt anders gelöst habe, werde ich den Tipp
          mal ausprobieren!

          beste gruesse,
          heinetz