2013-03-12 98 views
2

有很多與此有關的問題,但所有使用內部連接的相同答案,這是(我認爲)不可能在這裏。 (說我,如果我錯了)ORDER BY字段中的MySQL子查詢。 (沒有內部連接)

我現在正在做的是調用兩個不同的mysql查詢來獲得結果。它完美的作品。

$db->query("SELECT * FROM `meta` WHERE `metakey` = 'category_order'"); 
$order = $db->fetch_assoc()['metavalue']; 
/*$order = 2,1,12,11,10*/ 

$db->query("SELECT * FROM `categories` WHERE `parent` = '0' ORDER BY field(ID, $order)");   
$cats = $db->fetch(); 

我們減少查詢的號碼,我想是這樣,

$db->query("SELECT * FROM `categories` WHERE `parent` = '0' ORDER BY field(ID, (SELECT 'metavalue' FROM `meta` WHERE `metakey` = 'category_order'))"); 

它不顯示任何錯誤,但它給了我錯誤的輸出。有沒有辦法做到這一點?

EDIT

類別表的結構,

_________________ 
| ID | name | 
----------------- 
| 1 | A  | 
| 2 | B  | 
| 11 | C  | 
| 12 | D  | 
| 10 | E  | 
----------------- 

元表的結構,

______________________________________ 
| ID | metakey  | metavalue | 
-------------------------------------- 
| 1 | category_order | 2,1,12,11,10 | 
-------------------------------------- 

回答

1

我真的無法真正看到一種直接使用ORDER BY FIELD的方式。

但是,我想知道是否可以對元表執行JOIN操作,然後對FIND_IN_SET執行ORDER操作。

沒測試過這一點,但希望會給你的想法: -

SELECT * 
FROM `categories` 
INNER JOIN meta ON metakey = 'category_order' AND FIND_IN_SET(categories.ID,metavalue) 
WHERE `parent` = '0' 
ORDER BY FIND_IN_SET(categories.ID,metavalue) 

可能的FIND_IN_SET的JOIN是沒有必要的

+0

太棒了!這是像素完美的答案,像魅力一樣工作。謝謝@Kickstart。 – user1995997 2013-03-13 03:42:21

1

嘗試使用GROUP_CONCAT和唐;噸包裹柱metavalue用單引號作爲其轉換它字符串文字。

$db->query("SELECT * FROM `categories` WHERE `parent` = '0' ORDER BY field(ID, (SELECT GROUP_CONCAT(`metavalue`) FROM `meta WHERE `metakey` = 'category_order'))"); 
+0

它不顯示任何錯誤,但給出錯誤的輸出。輸出的順序應該是「2,1,12,11,10」,但它會給出「1,10,11,12,2」 – user1995997 2013-03-12 13:20:00