WHERE EXIST查询中的ORDER BY工作不正确

时间:2019-01-20 10:46:46

标签: mysql sql

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
       );

我的代码有什么问题,如何使其工作

我得到了一个未排序的用户数组(第一个查询),但是他们的护照的排序后的数组按最快的生日排序(子查询),我希望根据子查询规则输出用户排序后的数组。

2 个答案:

答案 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子句中使用,因此对输出没有影响