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

Operatori di valutazione logica di cortocircuito

Tieni presente che una query non viene eseguita in modo imperativo. La query che hai scritto potrebbe essere eseguita su più thread e quindi un operatore di cortocircuito nella clausola where non risulterebbe in un solo risultato.

Invece, usa il LIMIT clausola per restituire solo la prima riga.

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;

Per ottenere la migliore corrispondenza per tutti i libri in un set di risultati, salva i risultati in una tabella temporanea, trova il risultato migliore, quindi restituisci campi interessanti.

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;