MySQL 5.5中的AND
子句中是否有短路逻辑运算符(特别是short-circuitOR
和short-circuitWHERE
)?如果没有,还有其他选择吗?
关于我的问题的一个抽象的观点,以及我为什么需要这个的解释,可以在这个小提琴上找到:
http://sqlfiddle.com/#!2/97fd1/3
事实上,我们在数百个国家的数千个城市的数百万家书店里看到了数百万本书,这就是为什么我们不能接受在每次发送查询时接收不需要的信息的开销,并且在我们拥有满足当前条件的所有行之后,在转到下一个或之前,迫切需要找到使计算停止的方法。
如果你需要更多的信息请告诉我。提前谢谢。
根据要求,这里是小提琴中使用的模式:
CREATE TABLE quantitycache (
id INT AUTO_INCREMENT,
quantity INT,
book_id INT NOT NULL,
bookstore_id INT NULL,
city_id INT NULL,
country_id INT NULL,
PRIMARY KEY (id)
);
以及一些示例数据:
INSERT INTO quantitycache
(quantity, book_id, bookstore_id, city_id, country_id)
VALUES
(5, 1, 1, NULL, NULL),
(100, 2, 1, NULL, NULL),
(7, 1, 2, NULL, NULL),
(12, 1, NULL, 1, NULL),
(12, 1, NULL, NULL, 1),
(100, 2, NULL, 1, NULL),
(100, 2, NULL, NULL, 1),
(200, 3, NULL, 1, NULL),
(250, 3, NULL, NULL, 1);
最佳答案
请记住,查询不是强制执行的。您编写的查询可能在多个线程上运行,因此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;
关于mysql - 短路逻辑评估运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16969780/