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

Kortslutningslogiske evalueringsoperatører

Husk på, at en forespørgsel ikke eksekveres absolut. Den forespørgsel, du skrev, kan køre på flere tråde, og derfor vil en kortslutningsoperator i where-sætningen ikke kun resultere i ét resultat.

Brug i stedet LIMIT klausul for kun at returnere den første række.

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;

For at få det bedste match for alle bøger i et resultatsæt skal du gemme resultaterne i en midlertidig tabel, finde det bedste resultat og derefter returnere interessante felter.

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. Mysql JDBC-driver ClassNotFoundException

  2. Få adgang til markøren efter kolonnenavn dynamisk

  3. Hvordan man forårsager dødvande på MySQL

  4. RobotFramework :cx_Oracle - FAIL :InternalError:Ingen Oracle-fejl?