sql >> Databáze >  >> RDS >> Mysql

zlepšení dotazu na články související s MySQL

Nejprve prosím omluvte, že jsem trochu změnil názvy tabulek na message a message_tag pro čitelnost.

Za druhé, netestoval jsem to. Použijte jej spíše jako ukazatel než jednoznačnou odpověď.

Dotaz používá dva poddotazy, což nemusí být tak efektivní, pravděpodobně je co zlepšovat. Nejprve nejvnitřnější dotaz hledá značky aktuální zprávy. Poté prostřední dotaz hledá zprávy, které jsou označeny alespoň jednou společnou značkou. Seskupení se používá k získání jedinečného message_id a seřazení podle počtu společných značek. Nakonec JOIN se používá k načtení dalších podrobností a k odfiltrování starých zpráv.

Můžete si všimnout, že jsem místo '$xyz' použil otazníky . Je to proto, abychom se vyhnuli péči o únik z obsahu proměnné.

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. Příklady CURRENT_TIME – MySQL

  2. Funkce Oci_connect není v CentOS s Oracle definována

  3. VYTVOŘTE DATABÁZI uvnitř transakce

  4. Heroku PG:Obnovit přístup k zápisu byl zrušen