mysql: join mit Ausgabe in zweidimensionalem Array


Sempervivum

Erfahrenes Mitglied
Liebe PHP/mysql-Experten,
ich bin gerade dabei, mich mit diesem Thema etwas besser vertraut zu machen und habe dabei diese Aufgabe:
Ich habe zwei Tabellen, die ich mit einem einfachen Join verknüpfen möchte:

tenses
tenses-2.png

tensecategory
tense-cats.png

Diese lese ich folgender Maßen aus:
Code:
$sql = "SELECT t.name, c.catid, c.catname FROM tenses t, tensecategory c WHERE t.catid=c.catid";

$result = $pdo->query($sql);

$tenseinfo = [];
foreach ($result as $row) {
    if (!isset($tenseinfo[$row['catid']])) {
        $tenseinfo[$row['catid']] = ['catname' => $row['catname'], 'tenses' => [$row['name']]];
    } else {
        $tenseinfo[$row['catid']]['tenses'][] = $row['name'];
    }
}
var_dump($tenseinfo);
Dies funktioniert soweit einwandfrei und liefert dieses Ergebnis:

Code:
array (size=2)
  2 =>
    array (size=2)
      'catname' => string 'Indicative' (length=10)
      'tenses' =>
        array (size=3)
          0 => string 'Present Tense' (length=13)
          1 => string 'Present Perfect' (length=15)
          2 => string 'Imperfect' (length=9)
  17 =>
    array (size=2)
      'catname' => string 'Subjunctive' (length=11)
      'tenses' =>
        array (size=3)
          0 => string 'Preterite' (length=9)
          1 => string 'Past Perfect' (length=12)
          2 => string 'Subjunctive' (length=11)
Soweit so gut. Die Frage, die ich mir stelle, ist, ob man dieses Ergebnis auch mit SQL erreichen kann, ohne die Nachverarbeitung mit PHP. Ich erinnere mich an eine andere Aufgabe, wo es um COUNT und GROUP BY ging, da war es möglich, ein zweidimensionales Array zu erhalten. Versuche ich es bei dieser Aufgabe mit Gruppierung erziele ich jedoch nicht das gewünschte Ergebnis.
Beste Grüße - Ulrich
 

Sempervivum

Erfahrenes Mitglied
Nein, das hilft mir nicht. Wie oben geschrieben ist mir bekannt, dass und wie es mit GROUP und COUNT geht. Die Aufgabe hier sieht jedoch etwas anders aus.
 

Sempervivum

Erfahrenes Mitglied
Nein, da wird es auch nicht mit SQL gelöst, sondern ähnlich wie bei mir mit einer Nachbearbeitung in PHP. Es gibt dort jedoch einen unscheinbaren Link, wo beschrieben wird, dass es mit PDO machbar ist, und zwar mit der Option PDO::FETCH_GROUP. Das funktioniert einwandfrei. Wahrscheinlich geht es mit reinem SQL nicht, denn sonst hätten sich die Entwickler von PDO sicher nicht die Mühe gemacht, das zu implementieren.

So sieht der Code dann aus:
Code:
$sql = "SELECT c.catid, c.catname, t.name FROM tenses t, tensecategory c WHERE t.catid=c.catid";
$sth = $pdo->prepare($sql);
$sth->execute();

$tenseinfo = $sth->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
var_dump($tenseinfo);

echo '<table>';
foreach ($tenseinfo as $catid => $data) {
    echo '<tr><td>' . $catid . '</td>';
    echo '<td>' . $data[0]['catname'] . '</td>';
    echo '<td>';
    $sep = '';
    foreach ($data as $item) {
        echo $sep . $item['name'];
        $sep = ', ';
    }
    echo '</td></tr>';
}
Ich dachte auch daran, es mit einer Subquery zu lösen, etwa so:
SELECT c.catid, c.catname, (SELECT t.name FROM tenses t WHERE t.catid=c.catid) tc FROM tensecategory c
aber das funktioniert leider nicht; offenbar darf eine Subquery in der Select-Klausel nur eine Zeile zurück geben.
 

Neue Beiträge