有很多与此相关的问题,但都有相同的使用内连接的答案,这是(我认为)这里不可能。 (如果我错了,请说我)
我现在正在做的是调用两个不同的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 |
--------------------------------------
答案 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