2016-04-18 60 views
0

我想通过增加计数循环使用SQL顺序来选择数据。SQL - 如何通过增加计数循环来选择顺序

这是很难解释没有例子。

下面有一个表中的数据:

SELECT * FROM data_table ORDER BY point递减

------------------- 
| 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 | 

选择~~ ORDER BY增加 '猫' 循环。

期望的结果是:

------------------- 
| 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

那么什么是PHP的解决方案你有吗?可能是,某人或我自己可以转换成MySQL查询。 –

+0

哦,我编辑那句话。这可能会带来误解。我找不到任何解决方案。 –

+0

好吧。你能告诉我背后的逻辑是什么吗?首先获得哪个'1'?或者......你明白吗?有两个或更多'1'。 –

回答

1

ROW_NUMBER函数在MYSQL不存在。但是这应该会给你想要的结果。 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服务器):

SELECT * 
FROM data_table t 
ORDER BY ROW_NUMBER() OVER(PARTITION BY t.cat ORDER BY t.id DESC), t.cat 
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 

你只需要删除行作为猫= 4只有我排

而且 - 你可能需要将值“1000”更改为动态

+0

我尝试应用我的数据,但不起作用。 (混合起来) 在我的情况下,'id'不是真正的“id”。这只是一个INT领域。 –

+0

我根据你的表格示例编写了脚本 –