CirTap: komplizierte SQL-Abfrage

Beitrag lesen

ah jetzt ja...

also, du wirst wohl nicht umhin kommen, die Namen der Tabellen (wenn sie denn so dynamisch sind) erstmal mit einem SELECT rauszusuchen, damit du sie in einer zweiten Abfrage verwenden kannst.

also in pseudo-code:
$tabellen = $db->query("SELECT * from index-tabelle");
foreach($tabellen => $tabelle) {
  $sql .= "siehe unten :)"
}
$top5 = $db->query($sql);
echo $top5;

Genaugenommen ist dein Freund für die eigentliche Top 5: UNION. Ich hoffe du hast das in eienr MySQL4 DB oder einer DB die UNION kennt -- sonst wirds nix.

(SELECT adresse, klicks FROM jugendtreffs ORDER BY klicks DESC LIMIT 0, 5)
  UNION
(SELECT adresse, klicks FROM partner ORDER BY klicks DESC LIMIT 0, 5)
  UNION
(SELECT adresse, klicks FROM sonstiges ORDER BY klicks DESC LIMIT 0, 5)
  ORDER BY klicks DESC LIMIT 0, 5

Die "(SELECT..) UNION" Zeilen kannst du wie oben angedeutet in einer Schleife zusammenbasteln wobei der Tabellenname eben aus der zuvor gelesenen "index" Tabelle stammt.

Wichtig bei UNION: die einzelnen SELECTs müssen die gleiche Anzahl Spalten und diese die gleichen Datentypen haben. Hier sind's immer zwei Spalten: 1. = Text, 2. = Zahl. Falls es hier kracht, prüfe ob fie "adresse" Spalte auch wirklich gleich lange VARCHAR() sind, und die klicks nicht mal doubles, longs, und ints -- nur zur Sicherheit. Ebenso bestimmt das erste SELECT wie deine Felder nachher in der DB-Ausgabe heissen.

Jeder der SELECTs liefert dir von den Besten (ORDER BY klicks DESC) die ersten 5 (LIMIT 0, 5), das sind erstmal maximal 15 Datensätze.

Nachdem alle drei Tabellen zusammen sind, wird nochmal absteigend sortiert und daraus wieder die TOP 5 ermittelt.
Denk an die Klammern um jede SELECT Anweisung.

Also bei mir gings :-)

Viel Spaß,
CirTap