MySQL 仅获取条件在 3 列之间的第一个匹配项

MySQL Get only first match of a conditions between 3 columns

我正在使用可以访问 MySQL 数据库的 API REST (NodeJS)。 在这个数据库中,有一个 table 看起来像这样(我们将其命名为 Table_01):

| C_0| C_1| C_2| C_3| 
|  1 | A1 | B1 |  1 |
|  2 | A1 | B2 |  0 |
|  3 | B1 | A1 |  0 |
|  4 | A2 | B1 |  0 |
|  5 | B2 | A1 |  1 |
|  6 | B1 | A1 |  0 |
|  7 | B3 | A1 |  0 |
|  8 | A1 | B3 |  1 |
|  9 | A3 | B1 |  0 |
| 10 | A1 | B3 |  1 |
| 11 | A1 | B1 |  0 |

我的 objective 是在 C_3 上为 C_1 和 C_2.[=15= 中的一对值获取值 = 1 的第一个匹配项]

举个例子吧

我想知道在什么情况下 A_1 in C_1, 1 in C_3(仅第一场比赛)

所以,在这种情况下,结果应该是:

A1 B1 1
A1 B3 1

JSON格式:

result = [
  {
    "C_1": "A1",
    "C_2": "B1",
    "C_3": "1",
  },
  {
    "C_1": "A1",
    "C_2": "B3",
    "C_3": "1",
  }
];

我不想收到两次第二次,因为 A1 B3 = 1 在 table.

中包含了 2 次

我这样做可以得到结果:

db.query('SELECT * FROM `Table_01` WHERE (`C_1` = A1 AND `C_2` = '+db.escape(value)+') AND `C_3` = 1',
  (err, res) => {
    ..
  }
);

但这会给我第三个条目,其中包含重复的 A1 B3 1。

显然在这个例子中不是很重要。但是对于 table 满行,这对于避免非常大的响应和后验 JS 过滤器很重要。

一种方法使用相关子查询进行过滤:

select t.*
from table_01 t
where t.id = (
    select min(t1.id) 
    from table_01 t1 
    where t1.c_1 = t.c_1 and t1.c_2 = t.c_2 and t1.c_3 = 1 
)

你也可以使用window函数,如果你是运行 MySQL 8.0:

select *
from (
    select t.*,
        row_number() over(partition by c_1, c_2 order by id) rn
    from mytable t
    where c_3 = 1
) t
where rn = 1