Имайте предвид, че заявката не се изпълнява императивно. Заявката, която сте написали, може да се изпълнява на множество нишки и следователно оператор за късо съединение в клаузата where няма да доведе до само един резултат.
Вместо това използвайте LIMIT
клауза за връщане само на първия ред.
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;
За да получите най-доброто съвпадение за всички книги в набор от резултати, запазете резултатите във временна таблица, намерете най-добрия резултат и след това върнете интересни полета.
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;