这是一个有效的 sql 语句吗?或者有更好的选择吗?

Posted

技术标签:

【中文标题】这是一个有效的 sql 语句吗?或者有更好的选择吗?【英文标题】:Is this a valid sql Statement? Or is there a better alternative for this? 【发布时间】:2020-12-11 10:02:30 【问题描述】:

sql语句为:

SELECT * FROM support_chat WHERE (`from`=? AND `to`=?) OR (`from`=? AND `to`=?);

或者这个sql语句有替代方案吗?而且,这个sql语句是否有效(我认为是,但请告诉我)?

以防万一: 我的 mysql 版本是 8.0.22(从 https://dev.mysql.com/downloads 安装,带有 boost for linux 的源发行版)

【问题讨论】:

这是一个关于无序对的测试吗?也就是说,fromto 是否总是在查询的第二部分交换? 【参考方案1】:

让我使用文字值而不是参数,因此语法更清晰。你似乎想要:

where (`from` = 1 AND `to` = 2) OR (`from` = 2 AND `to` = 1)

这行得通,并且(可能!)做你想做的事。您还可以表述逻辑元组相等,这会缩短条件:

where (`from`, `to`) in ((1, 2), (2, 1))

这可能比您的原始代码更有效,特别是如果您在(from, to) 上有索引。

或者,如果您不想重复参数:

where (1, 2) in ((`from`, `to`), (`to`, `from`))

另一种使用least()greatest()

where least(`from`, `to`) = 1 and greatest(`from`, `to`) = 2

这将利用最近版本的 MySQL 支持的表达式索引:

create index idx_support_chat on support_chat((least(`from`, `to`)), (greatest(`from`, `to`)));

【讨论】:

首先是where (`from` = 1 AND `to` = 2) OR (`from` = 2 AND `to` = 1) 有效吗?确定吗? 我确实有 sql 知识,但我想小心某些事情。 where (`from` = 1 AND `to` = 2) OR (`from` = 2 AND `to` = 1)首先有效吗? @WebTestingRL 如果它无效,它将触发语法错误。是否正确取决于逻辑是否符合你的目标。 @ÁlvaroGonzález Oof,这解决了我的奇怪感觉,即某些事情可能会关闭

以上是关于这是一个有效的 sql 语句吗?或者有更好的选择吗?的主要内容,如果未能解决你的问题,请参考以下文章

可以用动态部分扩展静态 SQL 语句吗?

<?= 是一个有效的 php 语句吗?

这是一个有效的 PERCENTILE_CONT SQL 查询吗?

使用多个 LIKE 语句和 REGEXP 的查询可以更有效吗?

将值计算从 SQL 移到 PHP 层会更好吗?

excel里可以使用sql语句吗