ORDER BY不适用于存在的地方
我有ORM生成的SQL,但它对数据的排序不正确
SELECT * FROM `users`
WHERE (
EXISTS
(
SELECT *
FROM `passports`
WHERE `users`.`id` = `passports`.`user_id`
AND DATE_ADD(
birth_date,
INTERVAL YEAR(CURDATE())-YEAR(birth_date) + IF(DAYOFYEAR(CURDATE())
> DAYOFYEAR(birth_date),1,0)
YEAR)
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
ORDER BY DATE_ADD(
birth_date,
INTERVAL YEAR(CURDATE())-YEAR(birth_date)
+ IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(birth_date),1,0)
YEAR
);
)
ORDER BY不起作用 但是子查询排序正确
SELECT *
FROM passports
WHERE DATE_ADD(
birth_date,
INTERVAL YEAR(CURDATE())-YEAR(birth_date)
+ IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(birth_date),1,0)
YEAR
)
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
ORDER BY DATE_ADD(
birth_date,
INTERVAL YEAR(CURDATE())-YEAR(birth_date)
+ IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(birth_date),1,0)
YEAR
);
我的代码有什么问题,如何使其工作
我得到了一个未排序的用户数组(第一个查询),但是他们的护照的排序后的数组按最快的生日排序(子查询),我希望根据子查询规则输出用户排序后的数组。
答案 0 :(得分:1)
这是因为您在错误的位置下了订单。在子查询中,系统对行进行排序,但是在外部查询中,它们没有任何顺序(在SQL中,即使它们是有序的,SELECT也不会以该顺序返回信息。您需要进行排序通过,如果您想要特定的订单)。您应该通过以下方式取出订单:
https://my-app.com
编辑
正如您所说,它找不到列SELECT *
FROM `users`
WHERE EXISTS
(SELECT *
FROM `passports`
WHERE `users`.`id` = `passports`.`user_id`
AND DATE_ADD(birth_date,
INTERVAL YEAR(CURDATE())-YEAR(birth_date) + IF(DAYOFYEAR(CURDATE())
> DAYOFYEAR(birth_date),1,0)
YEAR)
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
)
ORDER BY DATE_ADD(birth_date,
INTERVAL YEAR(CURDATE())-YEAR(birth_date)
+ IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(birth_date),1,0)
YEAR)
中的列birth_date
。我将所有查询更改为使用内部联接而不是EXISTS:
passports
如果不需要所有列,则必须在SELECT *
FROM `users`
inner join `passports` on `users`.`id` = `passports`.`user_id`
WHERE DATE_ADD(birth_date,
INTERVAL YEAR(CURDATE())-YEAR(birth_date) + IF(DAYOFYEAR(CURDATE())
> DAYOFYEAR(birth_date),1,0)
YEAR)
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
ORDER BY DATE_ADD(birth_date,
INTERVAL YEAR(CURDATE())-YEAR(birth_date)
+ IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(birth_date),1,0)
YEAR)
中通过所需列的名称(SELECT *
等)来更改*
答案 1 :(得分:0)
主要问题是为什么您需要在EXISTS中使用order by子句? ORM肯定会生成错误的SQL。最好使用您的ORM代码打开一个新问题,以便解决该问题。
您不能期望在这种情况下对您的输出数据进行排序。子查询在内部排序不存在于主查询上。
简单示例
select * from tb
where exists (
select x from tb2
order by x
);
仅对带有tb2的子查询进行排序,但是由于它在EXISTS子句中使用,因此对输出没有影响