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的操作。