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查询可以在哪里进行限制吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章