sql >> Databáze >  >> RDS >> Mysql

Operátory vyhodnocení logiky zkratu

Mějte na paměti, že dotaz se neprovádí imperativně. Dotaz, který jste napsali, může běžet na více vláknech, a proto by operátor zkratu v klauzuli where nevedl k jedinému výsledku.

Místo toho použijte LIMIT klauzule vrátit pouze první řádek.

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;

Chcete-li získat nejlepší shodu pro všechny knihy v sadě výsledků, uložte výsledky do dočasné tabulky, najděte nejlepší výsledek a poté vraťte zajímavá pole.

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 UNION DISTINCT

  2. Proč v Oracle SQL nejsou odstraněné (nepotvrzené) řádky viditelné v aktuální relaci, ale viditelné v jiných relacích?

  3. Atomic UPSERT v SQL Server 2005

  4. Foreach Loop Container pro úlohu toku dat