2014-01-14 17 views
0

排序我已在SQL表SQL查詢的ID與預定義的名稱

ID | country_id | name 
1  33   test1 
2  77   test3 
3  33   test5 
4  1   test6 
5  77   test7 
6  33   test8 

我想COUNTRY_ID訂購此每個COUNTRY_ID都有它自己的名字(但不是在另一個數據庫)以下。

EX:

$countries = array(
    77 => 'Macedonia', 
    33 => 'Uruguay', 
    1 => 'Ghana' 
); 

那麼結果會是這樣的:

ID | country_id   | name 
4   1 (G hana)  test6 
2   77 (M acedonia) test3 
5   77 (M acedonia) test7 
1   33 (U ruguay)  test1 
3   33 (U ruguay)  test5 
6   33 (U ruguay)  test8 
+0

您是否沒有將country_id映射到您要訂購的國家/地區的表格?如果不是,爲什麼不呢?如果國家/地區名稱只存在於應用程序代碼中,那麼我只會將訂單留給應用程序。否則,你將會有一個緊密耦合的,脆弱的解決方案,試圖根據其他地方存在的某個國家/地區映射在數據庫中訂購。 –

+0

不,我沒有另一張桌子。我無法創建一個。 –

+0

爲什麼在數據庫中甚至有一個國家編號?如果可以的話,還有另一張表將這些編號映射到一些有用的東西?如果你可以修改這個表的模式,也許只需要用國家名替換id即可。我也覺得很奇怪你不能創建表格。如果有人希望你做這項工作並實現這個功能,他們需要讓你潛在地改變模式。 –

回答

1

你有興趣在MySQL的FIELD()功能,這將允許你定義一個定製ORDER BY查詢:

SELECT 
    id, country_id, name 
FROM 
    countries 
ORDER BY 
    FIELD(country_id, 77, 33, 1); 

FIELD() a讓你定義一個「有序列表」,然後檢查你傳入的值位於列表中的索引/位置;你可以用它來生成你自定義的ORDER BY

如果你有一個數組在PHP像你$countries顯示,你可以很容易地生成與查詢:

或者,如果你有一個包含國名的第二基準表,你可以JOIN反對那:

SELECT 
    a.id, a.country_id, a.name 
FROM 
    your_table a 
    JOIN countries c 
     on a.country_id = c.id 
ORDER BY 
    c.name; 

我會推薦後一種方法,因爲它更便攜。

+0

好吧,但它是如何知道77與馬其頓,33與烏拉圭等等。此外,排序必須根據ID的已簽名名稱自動完成。 –

+0

@TudorRavoiu你說你有一個預定義的列表;如果你沒有關係表,你將不得不做一些硬編碼(即你按照它們應該在的順序編寫)。我已經更新了我的答案,以顯示一個簡單的例子,如果可以的話,使用示例'$ countries'數組如何使用PHP來做到這一點。 – newfurniturey

1

您需要使用$countries陣列,排序和使用它在ORDER BY

如所示
sort($countries); 
$order = implode(', ', array_keys($countries)); 

現在將陣列值進行排序,您可以使用按鍵作爲FIELD()順序newfurniturey

SELECT id, country_id, name 
FROM countries 
ORDER BY FIELD(country_id, $order); 

然而,即使只有3個國家我想創建另一個表並加入這一點。