2016-04-18 10 views
0

auswählen Ich möchte Daten mit SQL-Reihenfolge durch Erhöhung der Zählschleife auswählen.SQL - wie Reihenfolge durch Erhöhung der Zählschleife

Das ist ohne Beispiel schwer zu erklären.

Es gibt eine Tabelle unten angegebenen Daten:

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 Zunahme 'Katze' Schleife.

Folge erwarten:

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

ich sql in php bin.

Wenn es keine Möglichkeit gibt, das zu bekommen, muss ich PHP-Code finden oder schreiben.

Bitte geben Sie mir eine Hilfe, um dies so einfach wie möglich abzufragen.

Danke.

In meinem Fall ist id keine tatsächliche "ID", nur ein INT-Feld. -> Fix to "Punkt"

Es bedeutet "kann dupliziert werden und großen Integer-Wert haben".

+0

Also, was ist die PHP-Lösung, die Sie haben? Möglicherweise kann jemand oder ich in MySQL-Abfrage übersetzen. –

+0

Oh, ich bearbeite diesen Satz. Das konnte Missverständnisse hervorrufen. Ich konnte dafür keine Lösung finden. –

+0

Okay, großartig. Kannst du mir sagen, was ist die Logik dahinter? Wer zuerst "1" bekommt? Oder ... Du verstehst richtig? Es gibt zwei oder mehr '1's. –

Antwort

1

ROW_NUMBER Funktion existiert nicht in MYSQL ändern müssen. Aber das sollte Ihnen die gewünschten Ergebnisse bringen. 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 

Nur für den Fall (SQL Server):

SELECT * 
FROM data_table t 
ORDER BY ROW_NUMBER() OVER(PARTITION BY t.cat ORDER BY t.id DESC), t.cat 
0

Dude - ich habe es mit einem Tisch „aaa“ gleiche Arbeit wie Sie Sie werden es brauchen, um zu testen viel mehr den Code

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 

Sie müssen Reihen als Katze entfernen, nur um zu überprüfen = 4 mit mir auch nur

Zeile - Sie könnten den Wert „1000“ zu etwas dynamischen

+0

Ich versuche, auf meine Daten anzuwenden, funktioniert aber nicht. (gemischt) In meinem Fall ist "id" nicht die tatsächliche "id". Es ist nur ein INT-Feld. –

+0

Ich schrieb das Skript gemäß Ihrem Tabellenbeispiel –