2

有很多与此相关的问题,但都有相同的使用内连接的答案,这(我认为)在这里是不可能的。(如果我错了就说我)

我现在正在做的是调用两个不同的 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 |
--------------------------------------
4

2 回答 2

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'))");
于 2013-03-12T13:12:34.753 回答
1

我真的看不到直接使用 ORDER BY FIELD 的方法。

但是我想知道您是否可以对元表执行 JOIN,然后按 FIND_IN_SET 排序。

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

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

于 2013-03-12T14:07:40.357 回答