2016-11-16 33 views
2

我在找允許通過MySQL的自定義排序邏輯,允許以下數據集:交替次序通過邏輯在MySQL

+----+-----------------+------------+-------+--+ 
| ID |  item  | Popularity | Views | | 
+----+-----------------+------------+-------+--+ 
| 1 | A special place |   3 | 10 | | 
| 2 | Another title |   5 | 12 | | 
| 3 | Words go here |   1 | 15 | | 
| 4 | A wonder  |   2 |  8 | | 
+----+-----------------+------------+-------+--+ 

要返回以便交替,逐行人氣和然後通過的意見,因此,返回結果如下:

+----+-----------------+------------+-------+--+ 
| ID |  item  | Popularity | Views | | 
+----+-----------------+------------+-------+--+ 
| 3 | Words go here |   1 | 15 | | 
| 2 | Another title |   5 | 12 | | 
| 4 | A wonder  |   2 |  8 | | 
| 1 | A special place |   3 | 10 | | 
+----+-----------------+------------+-------+--+ 

在那裏你會看到第一行返回「最受歡迎」,第二行返回最意見,第三行返回第二個最流行,第四行返回第二個最多的視圖。

目前我通過mySQL收集整個表兩次,然後將這些結果合併到PHP中。當數據庫很大時,這不會削減它。這可能在MySQL中呢?

+0

你爲什麼要這樣排序的行? –

+0

是的,這是可能的 - 雖然我也喜歡你當前的方法 – Strawberry

+1

你可以用'usort'在PHP中進行這種類型的排序,但不知道如何在MySQL中直接做到這一點。 –

回答

0

我想這些方面的東西可以工作。考慮以下幾點:

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,x INT NOT NULL 
,y INT NOT NULL 
); 

INSERT INTO my_table VALUES 
(1,3,10), 
(2,5,12), 
(3,1,15), 
(4,2, 8) 
(5,4, 1); 

我們可以排名依次x和y,然後安排在一個列表中的那些行列 - 所以纔會有X1,Y1,X2,Y2,等等 - 但所有的行會出現兩次;曾經爲X級,一次用於y秩...

 SELECT * FROM 
     (
     (SELECT a.*, COUNT(*) rank FROM my_table a JOIN my_table b ON b.x <= a.x GROUP BY a.id) 
      UNION ALL 
     (SELECT a.*, COUNT(*) rank FROM my_table a JOIN my_table b ON b.y <= a.y GROUP BY a.id) 
     ) n 
     ORDER BY rank 

     +----+---+----+------+ 
     | id | x | y | rank | 
     +----+---+----+------+ 
     | 5 | 4 | 1 | 1 | 
     | 3 | 1 | 15 | 1 | 
     | 4 | 2 | 8 | 2 | 
     | 4 | 2 | 8 | 2 | 
     | 1 | 3 | 10 | 3 | 
     | 1 | 3 | 10 | 3 | 
     | 5 | 4 | 1 | 4 | 
     | 2 | 5 | 12 | 4 | 
     | 2 | 5 | 12 | 5 | 
     | 3 | 1 | 15 | 5 | 
     +----+---+----+------+ 

現在,我們可以只抓級別最低爲每個ID ...

SELECT id 
    , x 
    , y 
    FROM 
    (
     (SELECT a.*, COUNT(*) rank FROM my_table a JOIN my_table b ON b.x <= a.x GROUP BY a.id) 
     UNION ALL 
     (SELECT a.*, COUNT(*) rank FROM my_table a JOIN my_table b ON b.y <= a.y GROUP BY a.id) 
    ) m 
GROUP 
    BY id,x,y 
ORDER 
    BY MIN(rank); 
+----+---+----+ 
| id | x | y | 
+----+---+----+ 
| 3 | 1 | 15 | 
| 5 | 4 | 1 | 
| 4 | 2 | 8 | 
| 1 | 3 | 10 | 
| 2 | 5 | 12 | 
+----+---+----+   

順便說一句,這應該是與快變量 - 但我目前無法讓解決方案工作 - 也許是高級時刻。

+0

地獄是的 - 這看起來相當不錯。我會用這個邏輯做一些測試,並且如果一切正常,檢查它是正確的。謝謝你的幫助。 –