Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verbesserung der Abfrage von MySQL-bezogenen Artikeln

Bitte entschuldigen Sie zunächst, dass ich die Tabellennamen ein wenig in message geändert habe und message_tag für Lesbarkeit.

Zweitens habe ich das nicht getestet. Verwenden Sie es eher als Hinweis als als eindeutige Antwort.

Die Abfrage verwendet zwei Unterabfragen, die möglicherweise nicht so effizient sind, es gibt wahrscheinlich Raum für Verbesserungen. Zuerst sucht die innerste Abfrage nach den Tags der aktuellen Nachricht. Dann sucht die mittlere Abfrage nach Nachrichten, die mit mindestens einem gemeinsamen Tag gekennzeichnet sind. Die Gruppierung wird verwendet, um eine eindeutige message_id zu erhalten und sie nach der Anzahl gemeinsamer Tags zu ordnen. Zuletzt das JOIN wird verwendet, um zusätzliche Details zu laden und die alten Nachrichten herauszufiltern.

Sie werden vielleicht bemerken, dass ich anstelle von '$xyz' Fragezeichen verwendet habe . Dies soll die Sorge um das Escapen des Variableninhalts vermeiden.

SELECT message_id, title, date
FROM message
RIGHT JOIN (SELECT message_id, COUNT(*)
            FROM message_tag
            WHERE tag_id IN 
                (SELECT MT.tag_id FROM message_tag MT WHERE MT.message_id = ?)
            GROUP BY message_id
            ORDER BY COUNT(*) DESC) RELATED_MESSAGES
            ON message.message_id = RELATED_MESSAGES.message_id
WHERE date < ?