我正在使用mysql,我想使用ORDER BY与两个不同的列,但现在">
我怎么能做到这一点?这是我的mysql查询
select count(DISTINCT p.id) cnt,m.merchantName,l.`name` locality,c.name city,bc.`category_url`,
m.merchantId,mi.src,m.url,group_concat(psm.slot) slots,min(p.sp) sp,group_concat(distinct mi.src) imgs,group_concat( distinct mi.type) imgs_type,m.cuisines,
p.ptype,m.logo,bc.categoryName,m.profile
from products p
LEFT JOIN product_slot_mapping psm
on p.id=psm.productId
left join merchants m
on p.`merchantId`=m.merchantId
left join locality l
on m.localityId=l.localityId
left join city c
on l.cityId=c.cityId
LEFT JOIN area a
on c.areaId=a.area_id
left join `business_category` bc
on m.`businessCategoryId`=bc.`businessCategoryId`
left join merchant_image mi
on m.merchantid=mi.merchantId and mi.isActive=1 and mi.type=3 and mi.isActive=1
left join product_tags pt
on pt.businessCategoryId=m.businessCategoryId and p.ptype=pt.id
left join product_properities_mapping ppm on
p.id=ppm.productId
where p.ptype in (5,6) and p.merchantId in (15538,15696) and a.url='chandigarh' and p.status=1 and m.`isActive`=1 and salesTo>=NOW() and bc.category_url='salons-and-spa'
group by m.merchantId having cnt>0 order by p.sp DESC,m.merchantName ASC limit 100
MySQL允许在不完全group by模式下工作时无效查询。所以在使用mySQL时,一定要确保有SET sql_mode = 'ONLY_FULL_GROUP_BY';
。
这个设置影响MySQL处理无效聚合的方式。下面是一个简单的例子:
select employee_name from employees group by department;
我们在这里按部门分组,因此每个部门得到一个结果行。但是我们选择员工名。哪个?一个部门有很多员工。MySQL应该抛出一个错误,当它在完全分组模式下工作时。然而,当不在该模式下工作时,MySQL会静默地"修复"。您的无效查询如下:
select ANY_VALUE(employee_name) from employees group by department;
。它只是任意地为每个部门挑选一名员工。
现在,如果你有这个:
select department, min(employee_name)
from employees
group by department
order by employee_name;
MySQL将其转换为
select department, min(employee_name)
from employees
group by department
order by any_value(employee_name);
假设部门A有员工John和Tom,部门B有员工Max和Jane。你可能会预料到这样的结果:B|Jane, A|John,因为这是每个系中最小的名字,而且Jane在字母表中排在John之前。但是,该订单是针对该部门的任意员工名的,因此,如果DBMS恰好针对John和Max进行排序,您也可以得到这样的结果:A|John, B|Jane。结果似乎是无序的,但这是因为我们排序的东西,我们没有显示。
现在看看你的查询:
select ... min(p.sp) sp ...
group by m.merchantId
order by p.sp DESC, m.merchantName
MySQL将其转换为
select ... min(p.sp) sp ...
group by m.merchantId
order by ANY_VALUE(p.sp) DESC, m.merchantName
和上面所说的适用。如果您想按显示的sp
排序,那么按它排序:
select ... min(p.sp) sp ...
group by m.merchantId
order by min(p.sp) DESC, m.merchantName
order by sp DESC, m.merchantName
(即sp
而不是p.sp
)也应该工作,因为我认为别名将优先于ORDER BY
中的列名,但不会依赖于此。像在min(p.sp) sp
中那样使用列名作为别名是一个坏主意,因为这会导致混淆和错误。
(您还应该自己用select ... any_value(p.ptype) ...
替换select ... p.ptype ...
,以使查询中发生的事情更加明显。然后设置full group by模式,查看查询是否最终有效。
在两列排序的情况下,MySQL将第一个字段视为主字段,后一个字段视为辅助字段。因此,它首先对主数据进行排序,然后对第二个数据进行排序。您可以参考此链接,这就是为什么它似乎与p.sp
一起工作,然后根据m.merchantName
对其进行排序,因此您必须根据优先级编写列名。