我正在尝试运行以下查询,以便从category_child表中获取有序数据,并相应地从类别表中获取。 select * from where where in(select category_id from category_child where category_id = 1 order by sequence);
就像
select * from category where id in (2,3,4);
和
select * from category where id in (3,2,4);
给了我相同的结果。 有什么方法可以按相同的顺序得到结果。
category和category_child表是:
-- Table structure for table `category`
--
DROP TABLE IF EXISTS `category`;<br/>
/*!40101 SET @saved_cs_client = @@character_set_client */;<br/>
/*!40101 SET character_set_client = utf8 */;<br/>
CREATE TABLE `category` (<br/>
`id` int(11) NOT NULL AUTO_INCREMENT,<br/>
`name` VARCHAR(50) NOT NULL, <br/>
`description` VARCHAR(250) NOT NULL,<br/>
`image_url` VARCHAR(250),<br/>
`created_on` timestamp NOT NULL DEFAULT '2014-11-06 00:00:00',<br/>
`updated_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, <br/>
PRIMARY KEY (`id`)<br/>
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;<br/>
/*!40101 SET character_set_client = @saved_cs_client */;<br/>
--
-- Table structure for table `category_child`<br/>
--
DROP TABLE IF EXISTS `category_child`;<br/>
/*!40101 SET @saved_cs_client = @@character_set_client */;<br/>
/*!40101 SET character_set_client = utf8 */;<br/>
CREATE TABLE `category_child` (<br/>
`id` int(11) NOT NULL AUTO_INCREMENT,<br/>
`category_id` int(11) NOT NULL,<br/>
`child_id` int(11) NOT NULL,<br/>
`child_type` VARCHAR(100) NOT NULL,<br/>
`sequence` int(4) NOT NULL,<br/>
`created_on` timestamp NOT NULL DEFAULT '2014-11-06 00:00:00',<br/>
`updated_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, <br/>
PRIMARY KEY (`id`)<br/>
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;<br/>
/*!40101 SET character_set_client = @saved_cs_client */;<br/>
答案 0 :(得分:2)
以下查询
select c.*
from category c, category_child cc
where cc.category_id=1 and c.id=cc.child_id
order by cc.sequence;
会起作用,只需在Nir-Z给出的答案中稍微改变一下并删除连接。
答案 1 :(得分:1)
为什么不这样做
Select c.*
from category c
join category_child cc on cc.id=c.category_id
where cc.category_id=1
order by cc.sequence
答案 2 :(得分:1)
如果您尝试按category_child.sequence
排序,那么它们将以所使用的索引返回category
结果的任何顺序返回。
因此,@ Nir-Z的答案将按category_child.sequence
的顺序排序,但如果category
上有多个索引,则可能会得到不同的结果。
每次执行一致结果的唯一方法是提供category
的订单。
Select c.*
from category c
join category_child cc on cc.category_id=c.id
where cc.category_id=1
order by cc.sequence, c.name
c.name
可以是category
。
答案 3 :(得分:0)
您无法使用where
子句控制结果的顺序(至少不是确定性的)。相反,您应该只添加一个明确的order by
子句:
select * from category where id in (2,3,4) order by id;
select * from category where id in (3,2,4) order by id;