Php 多个限额,其中价格1价格2

Php 多个限额,其中价格1价格2,php,mysql,database,Php,Mysql,Database,我正在使用mysql和php 假设我的数据库中有超过400.000本书,如下表所示: +------+-------+--------+--------+ | Item | color | Price1 | Price2 | +------+-------+--------+--------+ | 1 | blue | 1.23 | 1.23 | | 2 | red | 2.34 | 2.66 | | 3 | green | 4.55 | 4.55

我正在使用mysql和php

假设我的数据库中有超过400.000本书,如下表所示:

+------+-------+--------+--------+
| Item | color | Price1 | Price2 |
+------+-------+--------+--------+
|    1 | blue  |   1.23 |   1.23 |
|    2 | red   |   2.34 |   2.66 |
|    3 | green |   4.55 |   4.55 |
|    4 | blue  |   2.33 |   2.44 |
|    5 | blue  |   3.44 |   3.66 |
|    6 | blue  |   4.55 |   4.66 |
|    7 | ...   |    ... |    ... |
+------+-------+--------+--------+
我想得到每种颜色的前5个条目,其中price1 price2。如果受影响的行小于5==>则我希望用price1==price2的条目填充查询

如果是蓝色,我希望得到以下结果:

+------+-------+--------+--------+
| Item | color | Price1 | Price2 |
+------+-------+--------+--------+
|    4 | blue  |   2.33 |   2.44 |
|    5 | blue  |   3.44 |   3.66 |
|    6 | blue  |   4.55 |   4.66 |
|    1 | blue  |   1.23 |   1.23 |
+------+-------+--------+--------+
我有一些解决办法:

SELECT * FROM books WHERE color = 'blue' AND price1<>price2 ORDER BY price1 LIMIT 5;

有没有合并此查询的方法?

您可以对每种颜色的行进行排序,以便首先显示price1 price2的行。 您可以使用行数窗口功能实现此条件排序:

SELECT t.Item, t.color, t.Price1, t.Price2  
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY color ORDER BY price1 <> price2 DESC, price1) rn
  FROM books 
) t
WHERE t.rn <= 5
如果需要特定颜色的结果,请执行以下操作:

SELECT *
FROM books 
WHERE color = 'blue'
ORDER BY price1 <> price2 DESC, price1
LIMIT 5

您可以对每种颜色的行进行排序,以便首先显示price1 price2的行。 您可以使用行数窗口功能实现此条件排序:

SELECT t.Item, t.color, t.Price1, t.Price2  
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY color ORDER BY price1 <> price2 DESC, price1) rn
  FROM books 
) t
WHERE t.rn <= 5
如果需要特定颜色的结果,请执行以下操作:

SELECT *
FROM books 
WHERE color = 'blue'
ORDER BY price1 <> price2 DESC, price1
LIMIT 5

让我们假设你有12本书和3种颜色,每个都要前两本。考虑到这一点,请参见根据您的第一次查询结果,您似乎有4个受影响的行,而不是3个,您能澄清一下吗?按价格顺序,您指的是哪一列?您的表中没有列价格。还有,你的MySql版本是什么?@KurtKline我有3行受影响的数据。项目为1的行的价格为1==价格。但我要的是价格。这就是为什么只有第4行、第5行和第6行受第一个sql查询的影响。@forpas Order by price1。很抱歉Mysql版本:10.4.11-MariaDBLet假设你有12本书和3种颜色,并且想要前两本。考虑到这一点,请参见根据您的第一次查询结果,您似乎有4个受影响的行,而不是3个,您能澄清一下吗?按价格顺序,您指的是哪一列?您的表中没有列价格。还有,你的MySql版本是什么?@KurtKline我有3行受影响的数据。项目为1的行的价格为1==价格。但我要的是价格。这就是为什么只有第4行、第5行和第6行受第一个sql查询的影响。@forpas Order by price1。很抱歉Mysql版本:10.4.11-MariaDBThanks。我将在明天晚些时候/早些时候进行测试。'SELECT*,按颜色顺序按价格划分的行数1 price2 DESC,price1 rn FROM books'不起作用。我抛出1064:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用near'PARTITION BY…@Ben for MariaDB 10.4.11的正确语法。代码运行良好:工作正常!谢谢除此之外,你还解决了我的另一个问题,得到了每个solor的5个结果。我会接受你的回答。我还有一个问题。我有另一张桌子,上面的颜色显示的顺序是希望的。表颜色顺序:[1:红色;2:黄色;3:蓝色;4:绿色;5:红色]。如何将此表的顺序与您的查询与row_number语句相连接?类似于这样:谢谢。我将在明天晚些时候/早些时候进行测试。'SELECT*,按颜色顺序按价格划分的行数1 price2 DESC,price1 rn FROM books'不起作用。我抛出1064:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用near'PARTITION BY…@Ben for MariaDB 10.4.11的正确语法。代码运行良好:工作正常!谢谢除此之外,你还解决了我的另一个问题,得到了每个solor的5个结果。我会接受你的回答。我还有一个问题。我有另一张桌子,上面的颜色显示的顺序是希望的。表颜色顺序:[1:红色;2:黄色;3:蓝色;4:绿色;5:红色]。如何使用row_number语句将此表的顺序与您的查询连接起来?如下所示: