Mysql
 sql >> Base de données >  >> RDS >> Mysql

Opérateurs d'évaluation de la logique de court-circuit

Gardez à l'esprit qu'une requête ne s'exécute pas impérativement. La requête que vous avez écrite peut s'exécuter sur plusieurs threads et, par conséquent, un opérateur de court-circuit dans la clause where n'entraînerait pas un seul résultat.

Utilisez plutôt la LIMIT clause pour ne renvoyer que la première ligne.

SELECT * FROM quantitycache
WHERE bookstore_id = 1 OR city_id = 1 OR country_id = 1
ORDER BY bookstore_id IS NULL ASC,
         city_id IS NULL ASC,
         country_id IS NULL ASC
LIMIT 1;

Pour obtenir la meilleure correspondance pour tous les livres d'un ensemble de résultats, enregistrez les résultats dans une table temporaire, recherchez le meilleur résultat, puis renvoyez les champs intéressants.

CREATE TEMPORARY TABLE results (id int, book_id int, match_rank int);

INSERT INTO results (id, book_id, match_rank)
SELECT id, book_id, 
    -- this assumes that lower numbers are better
    CASE WHEN Bookstore_ID is not null then 1 
         WHEN City_ID is not null then 2 
         ELSE 3 END as match_rank
FROM quantitycache
WHERE bookstore_id = 1 OR city_id = 1 OR country_id = 1;

Select * 
from (
    select book_id, MIN(match_rank) as best_rank 
    from results 
    group by book_id
) as r
inner join results as rid 
    on r.book_id = rid.book_id 
    and rid.match_rank = r.best_rank
inner join quantitycache as q on q.id = rid.id;

DROP TABLE results;