Mysql
 sql >> база данни >  >> RDS >> Mysql

Заявката не връща резултати само при добавяне на ORDER BY

Изглежда, че това е грешка в MySQL, за която подал сигнал . Стесних го до следния тестов случай, който би очаквал да върне един запис (но не го прави):

CREATE TABLE t (x INT NULL);  -- table with nullable column
INSERT INTO  t VALUES (0);    -- but non null data

SELECT   a.x                  -- select our nullable column
FROM     t a, (SELECT NULL) b -- joining it with anything at all

WHERE    EXISTS (             -- but filter on a subquery
           SELECT *
           FROM   (SELECT NULL) c -- doesn't really matter what
           HAVING a.x IS NOT NULL -- provided there is some correlated condition
                                  -- on our nullable column in the HAVING clause
         )

ORDER BY RAND()               -- then perform a filesort on the outer query

Вижте го на sqlfiddle .

Във вашия случай можете да направите няколко неща, за да коригирате това:

  1. Избягвайте корелираната подзаявка, като пренапишете като присъединяване:

    SELECT   *
    FROM     people AS p LEFT JOIN (people_stages AS s NATURAL JOIN (
               SELECT   person_id, MAX(created) created
               FROM     people_stages
               GROUP BY person_id
             ) t) ON s.person_id = p.id
    ORDER BY p.last_name
    
  2. Ако искате да запазите свързаната подзаявка (която обикновено може да доведе до слаба производителност, но често е по-лесна за разбиране), използвайте WHERE вместо HAVING :

    SELECT   * 
    FROM     people AS p LEFT JOIN people_stages AS s ON s.person_id = p.id
    WHERE    s.created = (
               SELECT MAX(created)
               FROM   people_stages
               WHERE  person_id = s.person_id
             )
    ORDER BY p.last_name
    
  3. Ако не можете да промените заявката, трябва да откриете, че правите people_stages.person_id колона без нула ще заобиколи проблема:

    ALTER TABLE people_stages MODIFY person_id BIGINT UNSIGNED NOT NULL
    

    Изглежда, че наличието на индекс в тази колона (който би бил необходим за въздействие на ограничение на външния ключ) също може да помогне:

    ALTER TABLE people_stages ADD FOREIGN KEY (person_id) REFERENCES people (id)
    
  4. Като алтернатива може да се премахне people_stages.person_id от списъка за избор или коригирайте стратегията за модел на данни/индексиране/заявка, за да избегнете сортиране на файлове (може да не е практично в този случай, но ги споменавам тук за пълнота).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Възможно ли е да се наложи проверка на данни в MySQL с помощта на регулярен израз

  2. TOP и ORDER BY sql грешка

  3. Как да обединя всички SQL-SQLite заявки по казус?

  4. Съхраненият тригер на mysql вече се използва от оператор, който е извикал съхранения тригер

  5. вземете реда с най-висока стойност в MySQL