2011-09-26 31 views
2

如果我做出選擇,從我的MySQL表所示:MySQL的 - 如何基於表的內部排序atable更新

SELECT * FROM mytable ORDER BY country_id, category 

我得到如下表:

+------------+----------+-------+ 
| country_id | category | order | 
+------------+----------+-------+ 
|   1 |  A |  0 | 
|   1 |  B |  0 | 
|   1 |  F |  0 | 
|   3 |  A |  0 | 
|   3 |  C |  0 | 
|   5 |  B |  0 | 
|   5 |  L |  0 | 
|   5 |  P |  0 | 
+------------+----------+-------+ 

我想要做的就是更新order列,以便該列的值是該行的country_id的順序。換句話說最後的表應該是這樣的:

+------------+----------+-------+ 
| country_id | category | order | 
+------------+----------+-------+ 
|   1 |  A |  1 | 
|   1 |  B |  2 | 
|   1 |  F |  3 | 
|   3 |  A |  1 | 
|   3 |  C |  2 | 
|   5 |  B |  1 | 
|   5 |  L |  2 | 
|   5 |  P |  3 | 
+------------+----------+-------+ 

如果我使用在子查詢前給出的原始查詢,這會給我正確的順序,但我無法弄清楚如何遍歷表和懷疑我錯誤地考慮了它。

我該如何得到這個結果?

非常感謝

+1

注意:沒有內部訂單,理論上每次運行查詢時可以得到不同的訂單。 – Karolis

+0

我不明白@Karolis。它正在訂購'country_id'的數字,然後'category'中的字母是不是?每次都會給出相同的順序。 – Joe

+0

是否有相同的對(country_id,category)? – Devart

回答

1

嘗試使用此查詢 -

UPDATE mytable t1 
    JOIN (
    SELECT t1.country_id, t1.category, COUNT(*) `order` 
    FROM mytable t1 
    LEFT JOIN mytable t2 
     ON t2.country_id = t1.country_id AND t2.category <= t1.category 
    GROUP BY 
     t1.country_id, t1.category 
) t2 
    ON t1.country_id = t2.country_id AND t1.category = t2.category 
SET t1.`order` = t2.`order` 

順便注意,您可以從表中刪除order字段,因爲這樣可以計算出這對飛。