Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Auswertungsoperatoren für Kurzschlusslogik

Beachten Sie, dass eine Abfrage nicht zwingend ausgeführt wird. Die von Ihnen geschriebene Abfrage kann auf mehreren Threads ausgeführt werden, und daher würde ein Kurzschlussoperator in der where-Klausel nicht nur zu einem Ergebnis führen.

Verwenden Sie stattdessen das LIMIT -Klausel, um nur die erste Zeile zurückzugeben.

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;

Um die beste Übereinstimmung für alle Bücher in einem Ergebnissatz zu erhalten, speichern Sie die Ergebnisse in einer temporären Tabelle, suchen Sie das beste Ergebnis und geben Sie dann interessante Felder zurück.

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;