我正在使用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;
获取受影响的行。在本例中: 3.启动另一个查询:
SELECT * FROM books WHERE color = 'blue' price1=price2 ORDER BY price1 LIMIT 2;
//Limit 2, because I ve already 3 rows from the first result.
有办法合并这个查询吗?
发布于 2021-02-07 11:22:59
您可以对每种颜色的行进行排序,以便首先显示带有price1 <> price2
的行。
可以使用ROW_NUMBER()
窗口函数实现此条件排序:
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
https://stackoverflow.com/questions/66087180
复制相似问题