sql >> Databáze >  >> RDS >> Mysql

Dotaz nevrací žádné výsledky, pouze pokud je přidáno ORDER BY

Zdá se, že se jedná o chybu v MySQL, o které jsem nahlásil . Zúžil jsem to na následující testovací případ, u kterého by se dalo očekávat, že vrátí jeden záznam (ale nevrací):

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

Podívejte se na to na sqlfiddle .

Ve vašem případě můžete udělat několik věcí, abyste to napravili:

  1. Vyhněte se korelovanému poddotazu přepsáním jako spojení:

    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. Pokud chcete zachovat korelovaný poddotaz (který může obecně poskytovat slabý výkon, ale je často snáze srozumitelný), použijte WHERE místo 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. Pokud nemůžete změnit dotaz, měli byste zjistit, že vytvoření people_stages.person_id sloupec non-nullable problém vyřeší:

    ALTER TABLE people_stages MODIFY person_id BIGINT UNSIGNED NOT NULL
    

    Zdá se, že mít index v tomto sloupci (který by byl vyžadován k provedení omezení cizího klíče) může také pomoci:

    ALTER TABLE people_stages ADD FOREIGN KEY (person_id) REFERENCES people (id)
    
  4. Alternativně lze odstranit people_stages.person_id z výběrového seznamu nebo upravte datový model/indexování/strategii dotazování, abyste se vyhnuli řazení souborů (v tomto případě nemusí být praktické, ale pro úplnost je zde uvádím).



  1. CONVERT() z data a času na příklady řetězců v SQL Server

  2. Jak integrovat Oracle a Kafka

  3. Jak vypočítat průběžný celkový počet v Redshift

  4. Vytvořit tabulku mysql přímo ze souboru CSV pomocí modulu úložiště CSV?