order by 和 union all

原创
2016/09/06 17:41
阅读数 73

order by 和 union all

业务要求是:

卖家查询车辆信息时,自己的发布的车辆信息排在列表前面,按时间降序,不受地区限制

不是自己的发布的车辆信息,排在后面,也按时间降序,但是受地区限制

就是sql中的  INSTR(isi.AREA_NAME ,?) > 0

我把上下两段相同的字段和相同的where条件删了,因为这个sql太TM长了。

slq:

SELECT * FROM

    (SELECT

            format(isi.cost_price / 10000, 2) costPrice,

            format(isi.price / 10000, 2) price

        FROM

            item_source_info isi

        WHERE

            isi.member_id = ?

        ORDER BY

            isi.creation_Date DESC

    ) AS t1

UNION ALL

SELECT * FROM

    (SELECT

                'XX.XX' costPrice,

                'XX.XX' price

            FROM

                item_source_info isi

            WHERE

                isi.member_id <> ?

            AND INSTR(isi.AREA_NAME ,?) > 0

            ORDER BY

                isi.creation_date DESC

        ) AS t2

这个sql,我可是弄了一上午呀。。。

错误用法有很多,我们只说正确用法

注:A,B是正常查询sql  ,O1,O2是排序规则,t1,t2是别名。

为了方便书写和表达;令     A = 

                                             SELECT

                                                    format(isi.cost_price / 10000, 2) costPrice,

                                                    format(isi.price / 10000, 2) price

                                             FROM

                                                    item_source_info isi

                                              WHERE

                                                    isi.member_id = ?

                                        B =                                                

                                             SELECT

                                                   'XX.XX' costPrice,

                                                   'XX.XX' price

                                              FROM

                                                   item_source_info isi

                                              WHERE

                                                    isi.member_id <> ?

                                              AND INSTR(isi.AREA_NAME ,?) > 0

 

                                        O1 = O2 =  isi.creation_date DESC

 

正确用法1:

SELECT * FROM (A ORDER BY O1)AS t1

UNION ALL

SELECT * FROM (B ORDER BY O2)AS t2

正确用法2:

A

UNION ALL

SELECT * FROM (B ORDER BY O2)AS t2

正确用法3:

SELECT * FROM (A ORDER BY O1)AS t1

UNION ALL

B

正确用法2和3是该段不排序.

 

总结:正确用法1,2和3,都有一个共同特点,在使用order by和union all或者是union时,

先取出数据将其放在一个临时表中,这个表就是我们取的别名t1,t2然后再进行union all的操作。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部