我想通过增加计数循环使用SQL顺序选择数据。
如果没有例子,这很难解释。
下面有一个表格数据:
SELECT * FROM data_table ORDER BY point
desc
-------------------
| point | data | cat |
===================
| 9 | a | 5 |
| 8 | b | 5 |
| 7 | c | 4 |
| 6 | d | 1 |
| 5 | e | 2 |
| 4 | f | 1 |
| 3 | g | 3 |
| 2 | h | 2 |
| 1 | i | 3 |
SELECT ~~ ORDER BY增加'cat'循环。
期待结果:
-------------------
| point | data | cat |
===================
| 6 | d | 1 | -> There are two '1', but this one have bigger point value.(6>4)
| 5 | e | 2 | -> There are two '2', but this one have bigger point value.(5>2)
| 3 | g | 3 |
| 7 | c | 4 |
| 9 | a | 5 |
| 4 | f | 1 |
| 2 | h | 2 |
| 1 | i | 3 |
-> Skip cat '4' because there are no '4' cat value more.
| 8 | b | 5 |
我在php中使用sql。
如果没有办法解决这个问题,我想我必须找到或编写php代码。
请尽可能轻松地帮我查询。
感谢。
就我而言,id
不是真正的“id”,只是一个INT字段。 - >修复“点”
这意味着“可以复制并具有较大的整数值”。
答案 0 :(得分:1)
MYSQL中不存在ROW_NUMBER函数。但这应该会给你想要的结果。 SQLFiddle
SELECT t.point, t.data, t.cat
FROM data_table t
ORDER BY
FIND_IN_SET(t.point, (
SELECT GROUP_CONCAT(point ORDER BY point DESC, cat ASC)
FROM data_table t1
where t1.cat = t.cat)),
cat
以防万一(SQL Server):
SELECT *
FROM data_table t
ORDER BY ROW_NUMBER() OVER(PARTITION BY t.cat ORDER BY t.id DESC), t.cat
答案 1 :(得分:0)
老兄 - 我得到了一张桌子" aaa"和你的一样 您将需要进行更多测试以验证代码
select *
from
(
select main.*
,@cur_value:=main.cat as cur_value
,@row_num := if (@cur_value = @prev_value, @row_num + 1, 0) as indexer
,@prev_value := @cur_value as prev_value
,if (@row_num > 0, @row_num * 1000 * main.cat, main.cat) as sort_index
from
(
select * from aaa order by cat asc , id desc
) main
,
(SELECT @row_num :=0, @prev_value := 0, @cur_value := 0) inn
) sort
order by sort.sort_index
您只需将行删除为cat = 4,只有I行
此外 - 您可能需要更改值" 1000"动态的东西