在1个查询中选择5个先前的记录,中间和5个下一个记录

时间:2015-03-19 15:05:17

标签: mysql sql

我知道标题可能不多说,但我不知道如何表达。
我想在php中创建一个脚本,但我不知道如何进行良好的查询。我想查询那样的工作:他想要的用户类型名称和他得到:5条记录,其价格> =比输入名称,输入记录,5条记录的价格< =比输入名称。

数据库架构:

id - int
name - string
price - int

示例数据:

1 test1 500
2 test2 400
3 test3 333
4 test4 666
5 test5 500
6 test6 111
7 test7 500
8 test8 222
9 test9 777
10 test10 888
11 test11 333
12 test12 444

输入'test7'时的预期结果:

10 test10 888
9 test9 777
4 test4 666
5 test5 500
1 test1 500
7 test7 500 - middle record
12 test12 444
2 test2 400
11 test11 333
3 test3 333
8 test8 222

我做了类似的事情,但有两个问题:

( 
SELECT `id`, `name`, `price` FROM `items` WHERE `price` >= price_select2 AND `name` != input_name ORDER BY `price` ASC LIMIT 5
)
UNION ALL
(
SELECT `id`, `name`, `price` FROM `items` WHERE `name` = 'test7'
)
UNION ALL
(
SELECT `id`, `name`, `price` FROM `items` WHERE `price` <= price_select2 AND `name` != input_name ORDER BY `price` DESC LIMIT 5
)
  1. 我不知道如何从1和3选择2中选择名称和价格(可能是变量,但我不知道如何正确使用它)
  2. 前5条记录的顺序不正确,我想反过来。

1 个答案:

答案 0 :(得分:2)

您可以使用union all

执行此操作
(select i.*
 from items i
 where price <= (select price from items i2 where name = @input_name)
 order by price desc
 limit 6
) union all
(select i.*
 from items i
 where price > (select price from items i2 where name = @input_name)
 order by price asc
 limit 5
)

如果您想按价格订购,请在查询结尾添加order by price