ध्यान रखें कि कोई क्वेरी अनिवार्य रूप से निष्पादित नहीं होती है। आपके द्वारा लिखी गई क्वेरी कई थ्रेड्स पर चल सकती है, और इसलिए जहां क्लॉज में शॉर्ट-सर्किट ऑपरेटर का परिणाम केवल एक परिणाम में नहीं होगा।
इसके बजाय, 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;