MySQL只获取3列之间条件的第一个匹配



我正在使用一个API REST(NodeJS(,它可以访问MySQL数据库。在这个数据库中,有一个表看起来像这样(让我们将其命名为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 |

我的目标是为C_1和C_2中的一对值获得C_3上的值=1的第一个匹配。

让我们举一个例子。

我想知道在哪些情况下,C_1中的A_1,C_31(仅第一个匹配(

因此,在这种情况下,结果应该是:

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在表中包含了两次。

我可以得到这样做的结果:

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。

显然,在这个例子中不是很重要。。但是,对于一个满是行的表,这对于避免非常大的响应和后验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 
)

如果您运行的是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

最新更新