可以在mysql 查询中进行限制吗?
Can where limit be made in mysql query?
由于在下面的查询中我添加了“limit 1”的部分中有不止一行满足定义的条件,所以我希望通过使用此限制获取满足条件的第一行来继续查询.我可以在我提到的地方做这样的限制吗?
表 1
| id | name |
|-------|-----------|
| 1 | pro1 |
| 2 | pro2 |
| 3 | pro3 |
表2
| id | start_date | end_date | product_id | daily | old_daily |
|----|------------|------------|------------|-------|-----------|
| 1 | 2021-02-19 | 2021-03-21 | 1 | 700 | 800 |
| 2 | 2021-02-19 | 2021-03-21 | 2 | 400 | 550 |
| 3 | 2021-02-19 | 2021-03-21 | 3 | NULL | 700 |
| 4 | 2021-03-22 | 2021-04-21 | 2 | NULL | 600 |
| 5 | 2021-04-22 | 2021-05-21 | 2 | NULL | 650 |
select
`table1`.`id`, `name`,
(CASE WHEN table2.daily IS NOT NULL THEN table2.daily
ELSE table2.old_daily END) AS price
from `table1`
inner join `table2` on `table1`.`id` = `table2`.`product_id`
where (date(`end_date`) >= '2021-02-11' LIMIT 1)
or (date(`start_date`) <= '2025-02-11'
and date(`end_date`) >= '2025-02-11')
order by `price` DESC
Limit1 在此查询中不起作用。无限查询结果如下:
| id | name | price |
|----|------|-------|
| 1 | pro1 | 700 |
| 2 | pro2 | 400 |
| 3 | pro3 | 700 |
| 2 | pro2 | 600 |
| 2 | pro2 | 650 |
我想要得到的结果:
| id | name | price |
|----|------|-------|
| 1 | pro1 | 700 |
| 2 | pro2 | 400 |
| 3 | pro3 | 700 |
我想在这些情况下您应该使用 UNION 功能,因为 MySQL 基于关系和函数概念。
而您的查询就像是“第一个条件只能满足一次”。
我在解决方案的最后提到了关于为什么 MySQL 和集合论不支持这一点的歧义。
一个解决方案可以是,
select `table1`.`id`, `name`,
(CASE WHEN table2.daily IS NOT NULL THEN table2.daily ELSE table2.old_daily END) AS price
from `table1` inner join `table2` on `table1`.`id` = `table2`.`product_id` where
date(`end_date`) >= '2021-02-11' LIMIT 1 order by `price` DESC
UNION
select `table1`.`id`, `name`,
(CASE WHEN table2.daily IS NOT NULL THEN table2.daily ELSE table2.old_daily END) AS price
from `table1` inner join `table2` on `table1`.`id` = `table2`.`product_id` where
(date(`start_date`) <= '2025-02-11' and date(`end_date`) >= '2025-02-11') order by `price` DESC;
假设您给出的条件为 A OR B,存在歧义的情况:
- 一条记录,R1满足A,不满足B
- A记录,R2同时满足A和B
如果先读取 R1,我们是否会考虑 R2,因为我们将条件 A 的使用限制为 1,但使用带 OR 子句的条件 B?
由于在下面的查询中我添加了“limit 1”的部分中有不止一行满足定义的条件,所以我希望通过使用此限制获取满足条件的第一行来继续查询.我可以在我提到的地方做这样的限制吗?
表 1
| id | name |
|-------|-----------|
| 1 | pro1 |
| 2 | pro2 |
| 3 | pro3 |
表2
| id | start_date | end_date | product_id | daily | old_daily |
|----|------------|------------|------------|-------|-----------|
| 1 | 2021-02-19 | 2021-03-21 | 1 | 700 | 800 |
| 2 | 2021-02-19 | 2021-03-21 | 2 | 400 | 550 |
| 3 | 2021-02-19 | 2021-03-21 | 3 | NULL | 700 |
| 4 | 2021-03-22 | 2021-04-21 | 2 | NULL | 600 |
| 5 | 2021-04-22 | 2021-05-21 | 2 | NULL | 650 |
select
`table1`.`id`, `name`,
(CASE WHEN table2.daily IS NOT NULL THEN table2.daily
ELSE table2.old_daily END) AS price
from `table1`
inner join `table2` on `table1`.`id` = `table2`.`product_id`
where (date(`end_date`) >= '2021-02-11' LIMIT 1)
or (date(`start_date`) <= '2025-02-11'
and date(`end_date`) >= '2025-02-11')
order by `price` DESC
Limit1 在此查询中不起作用。无限查询结果如下:
| id | name | price |
|----|------|-------|
| 1 | pro1 | 700 |
| 2 | pro2 | 400 |
| 3 | pro3 | 700 |
| 2 | pro2 | 600 |
| 2 | pro2 | 650 |
我想要得到的结果:
| id | name | price |
|----|------|-------|
| 1 | pro1 | 700 |
| 2 | pro2 | 400 |
| 3 | pro3 | 700 |
我想在这些情况下您应该使用 UNION 功能,因为 MySQL 基于关系和函数概念。 而您的查询就像是“第一个条件只能满足一次”。
我在解决方案的最后提到了关于为什么 MySQL 和集合论不支持这一点的歧义。
一个解决方案可以是,
select `table1`.`id`, `name`,
(CASE WHEN table2.daily IS NOT NULL THEN table2.daily ELSE table2.old_daily END) AS price
from `table1` inner join `table2` on `table1`.`id` = `table2`.`product_id` where
date(`end_date`) >= '2021-02-11' LIMIT 1 order by `price` DESC
UNION
select `table1`.`id`, `name`,
(CASE WHEN table2.daily IS NOT NULL THEN table2.daily ELSE table2.old_daily END) AS price
from `table1` inner join `table2` on `table1`.`id` = `table2`.`product_id` where
(date(`start_date`) <= '2025-02-11' and date(`end_date`) >= '2025-02-11') order by `price` DESC;
假设您给出的条件为 A OR B,存在歧义的情况:
- 一条记录,R1满足A,不满足B
- A记录,R2同时满足A和B
如果先读取 R1,我们是否会考虑 R2,因为我们将条件 A 的使用限制为 1,但使用带 OR 子句的条件 B?