可以在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,存在歧义的情况:

  1. 一条记录,R1满足A,不满足B
  2. A记录,R2同时满足A和B

如果先读取 R1,我们是否会考虑 R2,因为我们将条件 A 的使用限制为 1,但使用带 OR 子句的条件 B?