mysql - SQL查询以任意顺序将值列表与字段列表匹配而不重复

标签 mysql sql postgresql permutation mariadb

我最近不得不编写一个查询来过滤一些特定的数据,如下所示:

假设我有 3 个不同的值,我想在我的数据库中的一个表的 3 个不同字段中搜索它们,必须以所有可能的顺序搜索它们而不重复。

这是一个示例(为了便于理解,我将使用命名查询符号来显示必须放置值的位置):

val1 = "a", val2 = "b", val3 = "c"

这是我生成的查询:

SELECT * FROM table WHERE
(fieldA = :val1 AND fieldB = :val2 AND fieldC = :val3) OR
(fieldA = :val1 AND fieldB = :val3 AND fieldC = :val2) OR
(fieldA = :val2 AND fieldB = :val1 AND fieldC = :val3) OR
(fieldA = :val2 AND fieldB = :val3 AND fieldC = :val1) OR
(fieldA = :val3 AND fieldB = :val1 AND fieldC = :val2) OR
(fieldA = :val3 AND fieldB = :val2 AND fieldC = :val1)

我必须做的是生成一个查询来模拟没有重复的排列。有没有更好的方法来执行此类查询?

这对于 3x3 没问题,但如果我需要对更大的东西(如 9x9)执行相同的操作,那么生成查询将是一团糟。

我正在使用 MariaDB,但我可以接受可以在 PostgreSQL 上运行的答案。 (我想了解是否有一种无需“蛮力”即可编写此类查询的聪明方法)

最佳答案

没有更好的方法,但您可以使用in:

SELECT *
FROM table
WHERE :val1 in (fieldA, fieldB, fieldC) and
      :val2 in (fieldA, fieldB, fieldC) and
      :val3 in (fieldA, fieldB, fieldC)

至少它更短。而且,这是标准 SQL,因此它应该适用于任何数据库。

关于mysql - SQL查询以任意顺序将值列表与字段列表匹配而不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22207970/

相关文章:

sql - 试图计算 PostgreSQL 中两个经纬度点之间的距离 - PostgreSQL earth_box(ll_to_earth) 返回值的单位是什么?

postgresql - Postgres 服务器没有监听

php - Laravel 查询使用 AND 过滤不同的表

MySQL Join 语句从数据库中的同一字段多次提取项目

mysql 将当前用户的信息插入表中

带有 ID 列的 SQL View

sql - 如何创建生产 SQL 数据库的副本?

java - 是否需要将I/O操作同步到MySQL

sql - FromSqlRaw注入(inject)EF Core 3.0

mysql - DISTINCT ON 查询 w/ORDER BY 列的最大值