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
我正在使用可以访问 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