2013-03-12 93 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