gpt4 book ai didi

mysql - WHERE 与 HAVING 具有多个 IF/LIKE 的计算字段

转载 作者:行者123 更新时间:2023-11-29 10:50:30 25 4
gpt4 key购买 nike

如果我在使用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

最佳答案

在这种情况下,没有太大区别。这是一个分析。

  • 由于 WHEREORDER 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com