mysql查询可以在哪里进行限制吗? [复制]

Posted

技术标签:

【中文标题】mysql查询可以在哪里进行限制吗? [复制]【英文标题】:Can where limit be made in mysql query? [duplicate] 【发布时间】:2021-05-15 12:02:33 【问题描述】:

由于在我在以下查询中添加“限制 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   |

【问题讨论】:

您在寻找什么结果?比如,你为什么认为你需要LIMIT @RocketHazmat 我添加了我想要的结果。你能再检查一遍吗? 听起来不是LIMIT,而是GROUP BY table1.id(也可能是GROUP_CONCAT())。 尝试删除LIMIT 1 并尝试将order by price DESC 替换为group by table1.id ASC。看这个演示:sqlfiddle.com/#!9/86ed8e/5 为什么不是700、650、700? 【参考方案1】:

我想在这些情况下你应该使用 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,则存在歧义:

    A 记录,R1 满足 A,但不满足 B A记录,R2同时满足A和B

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

【讨论】:

As of now, I do not know of any set operator/function that has the power to limit the use of any sub-condition.稳定的学徒

以上是关于mysql查询可以在哪里进行限制吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL Inner Join 有限制吗?

mysql 查询 into outfile 文件导到哪里去了?

对于自制 mysql 安装,my.cnf 在哪里?

通过添加第二个查询实际上可以进行 SQL 注入吗?

mysql如何找出慢sql

分页可以只用一个 sql 查询吗? [复制]