Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Operadores de avaliação lógica de curto-circuito


Tenha em mente que uma consulta não é executada de forma imperativa. A consulta que você escreveu pode ser executada em vários threads e, portanto, um operador de curto-circuito na cláusula where não resultaria em apenas um resultado.

Em vez disso, use o LIMIT cláusula para retornar apenas a primeira linha.
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;

Para obter a melhor correspondência para todos os livros em um conjunto de resultados, salve os resultados em uma tabela temporária, encontre o melhor resultado e retorne campos interessantes.
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;