SQL - 如何通过增加计数循环来选择顺序

时间:2016-04-18 14:11:01

标签: php mysql sql

我想通过增加计数循环使用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字段。 - >修复“点”

这意味着“可以复制并具有较大的整数值”。

2 个答案:

答案 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"动态的东西