ORDER BY与多列不与Join在mysql中工作



我正在使用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对其进行排序,因此您必须根据优先级编写列名。

最新更新