Vinzenz Mai: mysql befehl gesucht

Beitrag lesen

Hallo stewe,

ID  |  Titel            | Untertitel                            | ...

12  | Der bla von bla   | Kolumbus und die Entdeckung Amerikas
234 | SQL verstehen     | Aufbau, Syntax & Funktionsweise

Dies im Gegensatz zur stichwortliste, wo beliebig viele Einträge mit einer bestimmten id und einem zugehörigen Stichwort stehen können

ID  |  Stichwort

12  |  bla
12  |  von
12  |  Kolumbus
12  |  Amerikas
234 |  SQL
234 |  verstehen
234 |  Aufbau

den unsortierten Teil Deiner Abfrage kannst Du umschreiben zu

SELECT DISTINCT  
    m.Titel,  
    -- weitere Spalten  
    s.Id  
FROM  
    medienliste m  
INNER JOIN  
    stichwortliste s  
ON  
    m.Id=s.Id  
WHERE  
    s.Stichwort IN ('schweiz', 'demografie')  

Du solltest sofort erkennen, wie Du die Erweiterung um zusätzliche Stichwörter vornehmen kannst. Außerdem sollte dies schon mal einen Performanceschub geben, weil

  • die Gruppierung entfällt,
  • bereits die WHERE-Klausel zur Einschränkung der Ergebnismenge genutzt wird,
  • die Aggregatsfunktionen nicht berechnet werden müssen.

. Befrage EXPLAIN, welche Indexe genutzt werden.

Da Du jedes Medium nur einmal haben willst, aber alle Datensätze zu einem Medium eh die gleichen Werte in allen Spalten aufweisen, kannst Du das Schlüsselwort DISTINCT nutzen, um nur einen Datensatz je Medium zu erhalten.

Warum verwendest Du in Deiner ORDER-BY-Klausel überall die Funktion IFNULL()?
Gibt es Medien ohne Titel? Ohne Untertitel kann ich mir vorstellen. Hier könnte die leere Zeichenkette als Standardwert in diesen Spalten helfen, falls die NULL-Werte nicht eine besondere Bedeutung tragen.

Reicht dir das obige Beispiel? Was hältst du vom allgemeinen Aufbau der Datenbank? (Dieser ist mir zwar grundsätzlich vorgegeben, ich könnte höchstens Anregungen weiterleiten)

Die Stichwortliste enthält Redundanzen, vermutlich aus Performancegründen.
Stichworte zu Medien ist eine typische n:m-Beziehung, die normalerweise über eine Zuordnungstabelle abgebildet wird.

Sonst noch: Hast Du Dir schon einmal die Volltextsuche angeschaut?

Ich berechne vorher noch mit PHP die Gesamtanzahl der Resultate (natürlich ohne Sortierung).

Nutze doch FOUND_ROWS() in Verbindung mit SQL_CALC_FOUND_ROWS.

Freundliche Grüße

Vinzenz