作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我在使用having时没有记错,则在没有任何过滤器的情况下执行查询,然后代码遍历所有结果以应用过滤器。但在本例中,我使用多个 Like//If 来计算我的订单。我想知道以下两者之间哪个更好:
SELECT Page.*,
if (`flags` LIKE CONCAT('%',?,'%'),
if (`title` LIKE CONCAT('%',?,'%'),
5,
3
),
if (`title` LIKE CONCAT('%',?,'%'),
2,
0
),
) as pageOrder
FROM Page
WHERE `flags` LIKE CONCAT('%',?,'%') OR `title` LIKE CONCAT('%',?,'%')
ORDER BY pageOrder DESC
或
SELECT Page.*,
if (`flags` LIKE CONCAT('%',?,'%'),
if (`title` LIKE CONCAT('%',?,'%'),
5,
3
),
if (`title` LIKE CONCAT('%',?,'%'),
2,
0
),
) as pageOrder
FROM Page
HAVING pageOrder > 0
ORDER BY pageOrder DESC
使用 mysql 5.7 和 php 7.1
最佳答案
在这种情况下,没有太大区别。这是一个分析。
由于 WHERE
或 ORDER BY
都不能使用索引,因此将扫描整个表(对于任一公式)。
表达式通常是整个查询的一小部分,因此通常我会忽略LIKE
。但是,在本例中,您将为每一行执行 3-4 个 LIKE
,大约是 WHERE
方法的两倍 LIKE
,因此可能会慢一些。
有人可能认为WHERE
更具可读性。
Page
的所有列和大部分行都将被铲入临时表中。但我认为这两种方法没有太大区别。另外,我不一定找到避免该问题的方法。
下面是一个稍微更紧凑但不是更快的表达 pageOrder 表达式的方法:
3 * (`flags` LIKE CONCAT('%',?,'%') +
2 * (`title` LIKE CONCAT('%',?,'%')
关于mysql - WHERE 与 HAVING 具有多个 IF/LIKE 的计算字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43827079/
我是一名优秀的程序员,十分优秀!