2017-05-17 4 views
0

Ich habe diese Abfrage, die eine Tabelle, die eine votes-Spalte enthält und rangiert sie 1., 2., 3. und so weiter. Ich möchte die Ränge auf die Top 3 Elemente beschränken, aber wenn ich HAVING benutze, scheint es über gerade Zahlen zu springen oder sogar zur nächsten Nummer zu springen, wenn ich HAVING rank <= 6 benutzen sollte.HABEN bestimmte Zahlen von einem Alias ​​übersprungen

SELECT `category`, 
     `year`, 
     `month`, `votes`, 
     @prev := @curr, 
     @curr := `votes`, 
     @rank := IF(@prev = @curr, @rank, @rank + @i) AS `rank`, 
     IF(@prev <> `votes`, @i:=1, @i:= @i+1) AS `counter` 
FROM `photo_contest` 
CROSS JOIN (SELECT @curr := null, @prev := null, @rank := 1, @i := 0) `tmp_tbl` 
WHERE `category` = 'World Up Close' 
    AND `year` = '2017' 
    AND `month` = 'April' 
    AND `votes` > 0 
HAVING `rank` <= 3 
ORDER BY `votes` DESC 

Es kann ein Problem mit unserem Server des PHP-Installation sein, da es eine viel ältere MySQL-Bibliothek (5.1.73) als der Server verwendet, die derzeit (5.6.35) ausgeführt wird, aber ich bin nicht sicher. Ich habe Probleme mit einer vorherigen Frage mit ähnlichen Abfragen gehabt.

+0

Sie können versuchen, 'LIMIT 3' zu verwenden – mxr7350

Antwort

0

Sie verwenden HAVING zusammen mit GROUP BY. In diesem Fall müssen Sie eine Unterabfrage ohne HAVING verwenden.

SELECT * 
FROM (SELECT <your query> ORDER BY `votes` DESC) as T 
WHERE rank <= 3 
Verwandte Themen