Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Kueri Tidak Mengembalikan Hasil Hanya Saat ORDER BY Ditambahkan

Ini tampaknya merupakan bug di MySQL, yang telah saya mengajukan laporan . Saya telah mempersempitnya ke kasus uji berikut, yang diharapkan untuk mengembalikan satu catatan (tetapi tidak):

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

Lihat di sqlfiddle .

Dalam kasus Anda, Anda dapat melakukan beberapa hal untuk memperbaikinya:

  1. Hindari subquery yang berkorelasi dengan menulis ulang sebagai gabungan:

    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. Jika Anda ingin mempertahankan subkueri yang berkorelasi (yang umumnya dapat menghasilkan kinerja yang buruk tetapi seringkali lebih mudah dipahami), gunakan WHERE bukannya 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. Jika Anda tidak dapat mengubah kueri, Anda akan menemukan bahwa membuat people_stages.person_id kolom non-nullable akan mengatasi masalah:

    ALTER TABLE people_stages MODIFY person_id BIGINT UNSIGNED NOT NULL
    

    Tampaknya memiliki indeks pada kolom itu (yang akan diperlukan untuk mempengaruhi batasan kunci asing) juga dapat membantu:

    ALTER TABLE people_stages ADD FOREIGN KEY (person_id) REFERENCES people (id)
    
  4. Atau seseorang dapat menghapus people_stages.person_id dari daftar pilih, atau sesuaikan model data/pengindeksan/strategi kueri untuk menghindari pengurutan file (mungkin tidak praktis dalam kasus ini, tetapi saya menyebutkannya di sini untuk kelengkapan).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP 7 tidak dapat menemukan MySQLi

  2. MYSQL &Phpmyadmin tidak menampilkan DB yang sama

  3. Tabel MySQL sebagai FIFO/Antrian

  4. Hapus SEMUA atau karakter tertentu yang tidak dapat dicetak dari kolom di mysql

  5. Kueri gema sebelum eksekusi dan tanpa eksekusi di Rekaman Aktif codeigniter