sql >> Database teknologi >  >> RDS >> Mysql

forbedring af MySQL-relaterede artikler forespørgsel

Først og fremmest, undskyld, at jeg ændrede tabelnavnene lidt til message og message_tag for læsbarhed.

For det andet testede jeg ikke dette. Brug det snarere som en pegepind end et entydigt svar.

Forespørgslen bruger to underforespørgsler, som måske ikke er så effektive, der er sandsynligvis plads til forbedringer. Først søger den inderste forespørgsel efter tags for den aktuelle besked. Derefter leder den midterste forespørgsel efter beskeder, der er markeret med mindst ét ​​fælles tag. Grupperingen bruges til at få unikt message_id og sortere dem efter antal almindelige tags. Til sidst, JOIN bruges til at indlæse yderligere detaljer og til at filtrere de gamle meddelelser fra.

Du bemærker måske, at jeg brugte spørgsmålstegn i stedet for '$xyz' . Dette er for at undgå bekymringen om at undslippe det variable indhold.

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. Adgang nægtet for bruger 'root'@'localhost' (ved hjælp af adgangskode:JA) - Ingen privilegier?

  2. Tips til at opgradere til fra MySQL 5.7 til MySQL 8

  3. Den angivne nøgle var for lang; max nøglelængde er 767 bytes - ASPNet Identity MySQL

  4. Hvorfor kan et indeks gøre en forespørgsel virkelig langsom?