【问题标题】:Select one line, one line above and one line below [duplicate]选择一行,上一行,下一行[重复]
【发布时间】:2020-02-21 08:50:03
【问题描述】:

我有一个带有值列的表。我需要选择用户选择的行(在前面),上一行下一行,所以:

我的“订单”表行

----------------------------------------------
id   |   price |
----------------------------------------------
1    |  1500.00 | 
2    |  1380.00 |
3    |  1880.00 |
4    |  1900.00 |
5    |  1450.00 |
6    |  1700.00 |

如果对方选择:1450.00,我要带1450.001380.001500.00。是否可以让这个 MySql 选择?还是我必须在 php 中执行此操作?

我现在只有初始查询:

SELECT * FROM `orders`
ORDER BY price;

【问题讨论】:

  • 只有这三个? 1450.00、1380.00 和 1500.00
  • WHERE price = 1450.00 OR price < 1450.00 OR price > 1450.00 LIMIT 3 也许,也许不是……
  • 是的!只有 3 个不完全是 '这些' 3 个值,但总是 3 个值,一个被选中,一个在上面,一个在下面

标签: mysql sql database select


【解决方案1】:

一种方法是使用 2 个 MySQL 语句。比如:

SELECT * FROM `orders` WHERE `price`>=$user_price ORDER BY `price` ASC LIMIT 2

这应该给你用户选择的价格和上面的行。然后就可以执行了

SELECT * FROM `orders` WHERE `price`<$user_price ORDER BY `price` DESC LIMIT 1

下面的行应该给你。

我不确定是否有办法将这两个查询结合起来,但如果我找到任何东西,我会更新答案:)

【讨论】:

    【解决方案2】:

    您可以选择最高和最低价格来获取行。让我们试试这段代码:

    SELECT * 
    FROM orders A
    WHERE A.price = 1450.00
    OR A.price = (SELECT MAX(B.price) FROM orders B WHERE B.price < 1450.00)
    OR A.price = (SELECT MIN(B.price) FROM orders B WHERE B.price > 1450.00)
    

    【讨论】:

    • 是的,伙计,这和我预期的一样完美,三行被选中,谢谢。
    【解决方案3】:

    这里是如何得到这个,使用max() on &lt; 1450min() on &gt; 1450

    select * from test
    where price in 
        (select price from test where price = 1450)
            or price in
                (select max(price) from test where price < 1450)
                or price in
                    (select min(price) from test where price > 1450)
    

    不要使用or,而是使用in,这样更简洁。

    select * from test
    where price in (1450, 
       (select max(price) from test where price < 1450),           
             (select min(price) from test where price > 1450))
    

    dbfiddle

    【讨论】:

    • 应该是select max(price) from test where price &lt; 1450
    • @catcon,是的,你的权利。
    【解决方案4】:

    如果价格是唯一的并且您只需要三行:

    (select o.*
     from orders o
     where o.price <= :price
     order by o.price
     limit 2
    ) union all
    (select o.*
     from orders o
     where o.price > :price
     order by o.price desc
     limit 1
    );
    

    您的问题并未说明在这些情况下该怎么做:

    • 当价格低于或等于最低价格时。
    • 当价格大于或等于最高价格时。
    • 价格重复时。

    【讨论】:

      【解决方案5】:

      我认为这个查询应该可以工作

      select price 
          from orders
          where price <= (select min(price) from orders where price > 1450.00)
      order by price desc
      limit 3
      

      【讨论】:

        猜你喜欢
        • 2020-12-28
        • 1970-01-01
        • 2014-05-15
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多