sql >> Databasteknik >  >> RDS >> Mysql

Kortslutningslogikutvärderingsoperatörer

Tänk på att en fråga inte körs absolut. Frågan du skrev kan köras på flera trådar, och därför skulle en kortslutningsoperator i where-satsen inte resultera i endast ett resultat.

Använd istället LIMIT sats för att endast returnera den första raden.

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;

För att få den bästa matchningen för alla böcker i en resultatuppsättning sparar du resultaten i en tillfällig tabell, hittar det bästa resultatet och returnerar sedan intressanta fält.

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;



  1. Indexering av booleska fält

  2. PHP Sparar sessioner i databasen. Läsmetoden verkar inte fungera

  3. Så här grupperar du en rapport efter flera fält i Access 2016

  4. SQL-fråga med två datum