Frage

Ich habe 3 Tische:

+-----------------+
|   validations   |
+----+-------+----+
| id | param | ...
+----+-------+
+------------------+
|   replacements   |
+----+-------------+
| id | replacement |
+----+-------------+
+--------------------------------+
|    validations-replacements    |
+---------------+----------------+
| validation_id | replacement_id |
+---------------+----------------+

Jetzt führe ich meine SQL -Abfrage auf diesen Tischen aus (natürlich mit Joins). Und was ich in PHP erhalte, ist Sth. so wie das:

...
[6] => stdClass Object
(
    [id] => 11
    [search_param] => Dänische Belletristik
    [replacement] => Denmark
)

[7] => stdClass Object
(
    [id] => 11
    [search_param] => Dänische Belletristik
    [replacement] => Fiction
)
...

Jetzt habe ich in meinem PHP-Array mehrmals das gleiche 'Search_param' und 'ID'. Das ist scheiße dafür, es auf den Bildschirm zu drucken. Ich könnte die Daten nach "ID" gruppieren, um dies zu vermeiden, aber dann habe ich nur 1 "Ersatz" -Werte verfügbar.

Was ich suche, wäre ein solches Ergebnis:

...
[7] => stdClass Object
(
    [id] => 11
    [search_param] => Dänische Belletristik
    [replacement] => array(Denmark, Fiction)
)
...

Was ich wissen möchte: Ist das mit meiner Tabellenstruktur möglich, indem ich nur die Abfrage repariere? Oder muss ich mich in meinem Php -Code darum kümmern - wenn ja: Irgendwelche Hinweise, wie es am besten geht? Es gibt viele Daten ... Ist meine Tabellenstruktur korrekt? Ich bin immer noch ein bisschen unsicher, wenn es um Datenbanken geht ...

Mit freundlichen Grüßen.

War es hilfreich?

Lösung

Es sieht so aus, als ob Sie alle Ersatz für einen bestimmten Suchparam anzeigen möchten? Angenommen, Ihre Frage ist so etwas wie:

SELECT * 
FROM validations_replacements vr 
INNER JOIN validations v ON v.id = vr.validation_id 
INNER JOIN replacements r ON r.id = vr.replacement_id
WHERE v.param = '$search_param'

Sie können sie entweder in PHP gruppieren, indem Sie mit dem Ergebnisarray spielen, vorausgesetzt, Ihr Ergebnisobjekt ist $results:

$replacements = array() ;
foreach ($results as $result) {
    $currSearchParam = $result['search_param'];
    $currReplacement = $result['replacement'] ;
    if (!isset($replacements[$currSearchParam])) {
        $replacements[$currSearchParam] = array() ;
    }
    $replacements[$currSearchParam][] = $currReplacement;
}

//I'll let you fill in the blanks like object id or naming the array keys as you wish

Oder Sie können es in MySQL tun und dann nur das Ergebnis in PHP iterieren:

SELECT v.id, v.param, GROUP_CONCAT(r.replacement)
FROM validations_replacements vr 
INNER JOIN validations v ON v.id = vr.validation_id 
INNER JOIN replacements r ON r.id = vr.replacement_id
WHERE v.param = '$search_param'
GROUP BY v.id

Mit GROUP_CONCAT Sie erhalten alle eine einzelne Ergebniszeile für jeden Suchparam und alle seine Ersetzungen in einer von Kommas getrennten Zeichenfolge, mit der Sie dann leicht arbeiten können, indem Sie das Ergebnis in PHP iterieren:

$replacements = array() ;
foreach ($results as $result) {
    $currSearchParam = $result['search_param'];
    $currReplacements = $result['replacements'] ;
    $replacements[$currSearchParam] = explode(',', $currReplacements) ;
}

Andere Tipps

Sieht so aus, als könntest du benutzen GROUP_CONCAT

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top