ORDER BY字段内的MySQL子查询。 (没有内部加入)

时间:2013-03-12 13:10:27

标签: php 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'))");

它没有显示任何错误,但它给了我错误的输出。有没有办法做到这一点?

修改

类别表的结构,

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

元表的结构,

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

2 个答案:

答案 0 :(得分: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'))");

答案 1 :(得分:1)

我无法真正看到使用ORDER BY FIELD直接进行操作的方法。

但是我想知道你是否可以对元表进行JOIN,然后对FIND_IN_SET进行ORDER BY。

没有对此进行测试,但希望能给你一个想法: -

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)

可能不需要JOIN上的FIND_IN_SET