Zum Inhalt springen

SQL Abfrage innerhalb einer while Schleife

Erstellt am 16. Februar 2008 · 6 Antworten · letzte Antwort am 18. Februar 2008

Tags: Frage

konkret ·

Hallo,

Möchte einen Datensatz aus der Tabelle 1 auslesen und in der Tabelle 2 nach dazugehörigen Datensätzen über den Primärschlüssel aus Tabelle 1 suchen.

Die Datensätze aus Tabelle 2 sollen dann untereinander nach dem Datensatz aus Tabelle 1 angezeigt werden.

Anschließend soll der nächste Datensatz aus Tabelle 1 ausgelesen werden, für den dann wieder die zugehörigen Datensätze aus Tabelle 2 ausgegeben werden sollen, usw. bis alle Datensätze aus Tabelle 1 abgearbeitet wurden.

Soll ca. so aussehen:
Datensatz Tab 1-1
Datensatz Tab 2-1-1
Datensatz Tab 2-1-2
Datensatz Tab 1-2
Datensatz Tab 2-2-1
Datensatz Tab 2-2-2
Datensatz Tab 2-2-3
usw...

Habs mal so probiert, funzt aber nicht so richtig?
Kann mir da vielleicht wer weiter helfen?

<?php	 
$storage_pid = $GLOBALS['TSFE']->id;
$t1 = 'table_1';
$t2 = 'table_2';
       
        #Auslesen der Daten aus Tabelle 1
	$res = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, 'SELECT * FROM '.$t1.'
                 WHERE '.$t1.'.pid = '.$storage_pid.' 
                 AND '.$t1.'.hidden = 0
                 ORDER BY '.$t1.'.crdate DESC');

	while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
        # Auslesen des Primärschlüssels des jeweiligen Datensatzes          	
	      $uid = $row['uid'];

	# Anzeigen der dazugehörigen Datensätze aus Tabelle 2, durch
        # übereinstimmung mit Primärschlüssel Tabelle 1
	      $res_com = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, 'SELECT * FROM                        
                  '.$t1.','.$t2.' 
	          WHERE '.$uid.' = '.$t2.'.cid_com 
	          AND '.$t2.'.hidden_com = 0
                  ORDER BY '.$t2.'.crdate_com DESC');

	      while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res_com)) {
	      
              # Hier Ausgabe aller Datensätze die übereinstimmen
	      
              }
	
        # Einfügen ins Template	
        $content_item .=
        $this->cObj->substituteMarkerArrayCached($template["item"],
          $markerArray, array(), array());
        
        }
?>

mfg konkret

konkret ·

So, habs mal mit JOIN versucht, klappt auch ganz gut bis auf:
Die Daten werden jetzt so angezeigt:

Datensatz 1-1
Datensatz 2-1-1
Datensatz 1-1
Datensatz 2-1-2
Datensatz 1-1
Datensatz 2-1-3
Datensatz 1-2
Datensatz 1-3
usw...

Also immer der eine Datensatz zwischen den zugehörigena aus Tabelle 2, möchte es aber eben so haben:

Datensatz 1-1
Datensatz 2-1-1
Datensatz 2-1-2
Datensatz 2-1-3
Datensatz 1-2
Datensatz 1-3
usw...

Mein SQL Befehl, jetzt mit nur einer while Schleife:

<?php
        $te = 'tabelle_1';
        $tc = 'tabelle_2'; 
        $res = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, 'SELECT * FROM '.$te.'
		LEFT OUTER JOIN '.$tc.' 
		ON '.$te.'.uid = '.$tc.'.cid_com 
	        AND '.$te.'.pid = '.$storage_pid.'
		AND '.$te.'.hidden = 0
		ORDER BY '.$te.'.crdate DESC, '.$tc.'.crdate_com DESC');
	while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
        #Daten ins Template einfüllen
        }
?>
konkret ·

INNER JOIN geht nicht, denn dann nimmt er nur Datensätze die Entsprechungen in beiden Tabellen haben, deshalb LEFT OUTER JOIN.

Habs jetzt folgendermaßen gelöst:

<?php
$te = 'tabelle1';
$tc = 'tabelle2';       
        
        $res = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, 'SELECT * FROM '.$te.'
			LEFT OUTER JOIN '.$tc.' 
			ON '.$te.'.uid = '.$tc.'.cid_com 
			AND '.$te.'.pid = '.$storage_pid.'
                        AND '.$te.'.hidden = 0
			ORDER BY '.$te.'.crdate DESC, '.$tc.'.crdate_com DESC
			LIMIT '.$start.','.$entries_site);
	while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
            
            # ID zu Beginn auslesen und in der if Abfrgae mit vorhergehender ID vergleichen          	
            $check_start = $row['uid'];
            
            # Überprüfen ob der Datensatz schon einmal ausgelesen wurde
		   if ($check_start == $check_end) {
                        #Dann leere Marker setzen
			$markerArray['###XYZ###'] = '';
		   } else {
                        #Sonst Marker füllen
			$markerArray['###XYZ###'] = '...'
		   }
            # Anzeigen der zugehörigen Unterdatensätze
            # Wenn eine übereinstimmung mit dem übergeordneten vorhanden ist
            # Dann Marker auffüllen
	          if ($row['cid_com'] == $row['uid']) {
		       $markerArray['###XYZ###'] = '...'
                       # Sonst leer lassen
                  } else {
                       $markerArray['###XYZ###'] = '';
                  } 
            
            # ID auslesen und bei nächstem Durchgang mit neuer ID vergleichen
            $check_end = $row['uid'];		
	
            # Einfügen des Content
            $content_item .=  
            $this->cObj->substituteMarkerArrayCached($template["item"], 
            $markerArray, array(), array());
        }

?>

mfg konkret

einpraegsam.​net ·
konkret schrieb

So, habs mal mit JOIN versucht, klappt auch ganz gut bis auf:
Die Daten werden jetzt so angezeigt:

Datensatz 1-1
Datensatz 2-1-1
Datensatz 1-1
Datensatz 2-1-2
Datensatz 1-1
Datensatz 2-1-3
Datensatz 1-2
Datensatz 1-3
usw...

Also immer der eine Datensatz zwischen den zugehörigena aus Tabelle 2, möchte es aber eben so haben:

Datensatz 1-1
Datensatz 2-1-1
Datensatz 2-1-2
Datensatz 2-1-3
Datensatz 1-2
Datensatz 1-3
usw...

GROUP BY ??