ORDER BY字段中的MySQL子查询。 (没有内部连接)
问题描述:
有很多与此有关的问题,但所有使用内部连接的相同答案,这是(我认为)不可能在这里。 (说我,如果我错了)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 |
--------------------------------------
答
我真的无法真正看到一种直接使用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是没有必要的
答
尝试使用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
太棒了!这是像素完美的答案,像魅力一样工作。谢谢@Kickstart。 – user1995997 2013-03-13 03:42:21