2016-04-18 58 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

我根據你的表格示例編寫了腳本 –