如何在mysql中使用in关键字获取有序结果集

时间:2014-11-19 06:40:40

标签: mysql sql

我正在尝试运行以下查询,以便从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/>

4 个答案:

答案 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;