开发日志:SQL/HQL按外键字段排序,同时能够读取外键为null的数据

现有表

表A


表B



要求:查出表A的所有数据,排序按外键的B的number排序,如果没有外键,则排最后。

如果使用

SQL:

 SELECT a.*,b.`number` FROM a,b WHEREa.`b_id` = b.`id` ORDER BY b.`number` ASC,a.`no` DESC

HQL:

FROM A a ORDER BY a.b.number ASC,a.`no`DESC

原表数据

查询出来的数据

无法读取出A表中外键为null的数据

解决方法,使用外联(http://blog.csdn.net/kaidishi/article/details/12747443和www.jb51.net/article/30974.htm)

SQL:

SELECT a.*,b.number FROM  a LEFT JOIN b ON a.`b_id` = b.`id` ORDER BY CASE  WHEN b.number IS NULL THEN 999 ELSE b.number END ASC,a.no DESC
-- 其中999为你认为b_number不可能超过的数,也可以添加参数来代替【在这用于给null的数据赋值,决定外键为null的数据的排序位置】如
DECLARE @maxNumber INT;
 SELECT @maxNumber =max(number)+1 FROM B ;
SELECT A.id,A.b_id,B.number FROM  A
 LEFT JOIN B ON A.b_Id = B.Id ORDER BY CASE WHEN B.number IS NULL THEN @maxNumber ELSE B.number END ASC,a.no DESC
也可以使用下面的方法实现将null值放在前面/后面的效果,参考:http://blog.csdn.net/kaidishi/article/details/12651977

SELECT a.*,b.number FROM  a LEFT JOIN b ON a.`b_id` = b.`id` ORDER BY -b.number  DESC,a.no  DESC

HQL:

SELECT a FROM A a LEFT JOIN a.b  b ORDER BY  -b.number DESC,a.`no` DESC 

查询结果

符合需求

用到的模拟表和数据

表A

DROP TABLE IF EXISTS `a`;

CREATE TABLE `a` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `b_id` int(11) DEFAULT NULL,
  `name` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `no` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

/*Data for the table `a` */

insert  into `a`(`id`,`b_id`,`name`,`no`) values (1,1,'排第一',0),(2,1,'排第一',0),(3,NULL,'空值',0),(4,2,'排第二',0),(5,3,'排第三',0),(6,NULL,'空值',1),(7,3,'排第三',1),(8,4,'排第四',1),(9,5,'排第五',1);

表B

DROP TABLE IF EXISTS `b`;

CREATE TABLE `b` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `number` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

/*Data for the table `b` */

insert  into `b`(`id`,`number`) values (1,1),(2,2),(3,3),(4,4);










 





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值