5 Stimmen

MySQL Inner Join Tabelle basierend auf Spaltenwert

Angenommen, ich habe eine Tabelle "stats" mit der folgenden Struktur:
tableName | id | pageViews
Die Spalte tableName entspricht den einzelnen Tabellen in der Datenbank.

Wenn eine Abfrage gegen "stats" ausgeführt wird, was wäre der beste Weg, um inner join gegen die tableName Spaltenergebnis, um die Daten der einzelnen Tabellen zu erhalten?
Ich dachte an die Ausführung von dynamischen Selects in einer foreach und dann die Ergebnisse zusammenführen. Z.B.:

foreach($tableNames as $tableName) {
    $sql = "SELECT      *
            FROM        stats s
            INNER JOIN  $tableName tbl ON s.id = tbl.id
            WHERE       tableName = '$tableName'";
}

7voto

ypercubeᵀᴹ Punkte 109378

Um die Statistiken aller Tabellen zu erhalten, können Sie eine UNION mit 2 oder mehr Selects, einen für jede Tabelle, verwenden:

( SELECT s.*
       , table1.title AS name      --or whatever field you want to show
  FROM stats s
    JOIN $tableName1 table1
      ON s.id = table1.id
  WHERE tableName = '$tableName1'
)
UNION ALL
( SELECT s.*
       , table2.name AS name      --or whatever field you want to show
  FROM stats s
    JOIN $tableName2 table2
      ON s.id = table2.id
  WHERE tableName = '$tableName2'
)
UNION ALL
( SELECT s.*
       , table3.lastname AS name      --or whatever field you want to show
  FROM stats s
    JOIN $tableName3 table3
      ON s.id = table3.id
  WHERE tableName = '$tableName3'
)
;

Die Anwendung von Winfreds Idee mit LEFT JOIN s. Es führt zu unterschiedlichen Ergebnissen, z.B. wird jedes Feld aus den anderen Tabellen in einer eigenen Spalte ausgegeben (und es treten viele NULLs auf).

SELECT s.*
     , table1.title      --or whatever fields you want to show
     , table2.name
     , table3.lastname   --etc
FROM stats s
  LEFT JOIN $tableName1 table1
    ON s.id = table1.id
      AND s.tableName = '$tableName1'
  LEFT JOIN $tableName2 table2
    ON s.id = table2.id
      AND s.tableName = '$tableName2'
  LEFT JOIN $tableName3 table3
    ON s.id = table3.id
      AND s.tableName = '$tableName3'
--this is to ensure that omited tables statistics don't appear
WHERE s.tablename IN
   ( '$tableName1'
   , '$tableName2'
   , '$tableName3'
   )
;

3voto

Winfred Punkte 875

Können Sie sich den Luxus leisten, zuerst alle Tabellen zu verknüpfen und sie dann zu verarbeiten?

SELECT *
    FROM stats s
    LEFT OUTER JOIN tbl1 ON s.id = tbl.id
    LEFT OUTER JOIN tbl2 ON s.id = tbl2.id

Dann nehmen Sie den Wert, den Sie brauchen, anschließend in Ihr Programm auf?

Sie sollten versuchen, die Anzahl der Datenbankabfragen so gering wie möglich zu halten und sie nach Möglichkeit in einem Durchgang durchzuführen.

Andernfalls denken Sie bitte an Gespeicherte Prozeduren etc

Dies ist eine einfache Möglichkeit (mit Gemeinkosten), und ich bin sicher, dass andere Ihnen auch helfen werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X