sql >> Databasteknik >  >> RDS >> Mysql

förbättra MySQL-relaterade artikelfråga

Först och främst, ursäkta att jag ändrade tabellnamnen lite till message och message_tag för läsbarhet.

För det andra testade jag inte detta. Använd det snarare som en pekare än ett definitivt svar.

Frågan använder två underfrågor, som kanske inte är så effektiva, det finns förmodligen ett utrymme för förbättringar. Först letar den innersta frågan efter taggarna för det aktuella meddelandet. Sedan söker den mellersta frågan efter meddelanden som är markerade med minst en gemensam tagg. Grupperingen används för att få unikt meddelande_id och sortera dem efter antal vanliga taggar. Sist, JOIN används för att ladda ytterligare information och för att filtrera bort gamla meddelanden.

Du kanske märker att jag använde frågetecken istället för '$xyz' . Detta för att undvika bry sig om att undkomma variabelinnehållet.

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 < ?


  1. Flerspråkiga fält i DB-tabeller

  2. KONVERTERA MySQL-fråga till SQL Server (MSSQL / SQLSRV) (Med DISTINCT)

  3. Oracle BLOB till base64 CLOB

  4. Standard datumtid med Ecto &Elixir