Bir MySQL sorgusu 2 sınırları olması mümkün mü?

6 Cevap php

Ok here is the situation (using PHP/MySQL) you are getting results from a large mysql table, lets say your mysql query returns 10,000 matching results and you have a paging script to show 20 results per page, your query might look like this

So page 1 query

SELECT column 
FROM table_name 
WHERE userId=1 
AND somethingelse=something else
LIMIT 0,20

So page 2 query

SELECT column 
FROM table_name 
WHERE userId=1 
AND somethingelse=something else
LIMIT 20,40

Şimdi bir anda 20 sonuçlarını kapma ancak arama ölçütleriyle eşleşen 10.000 satır bir toplam vardır,

How can you only return 3,000 of the 10,000 results and still do your paging of 20 per page with a LIMIT 20 in your query?

Ben bu imkansız olduğunu düşündüm ama myspace onlar php / mysql kullanarak değil ama nasıl elde edilebilir biliyorum, her nasılsa orada göz sayfada yapar?

UPDATE

Bazı insanlar yöntemleri bir çift ile cevap olduğunu görmek, bu hiçbiri aslında 3000 sayısını sınırlandırarak performansını artıracak gibi görünüyor?

6 Cevap

Programlamak için PHP o LIMIT 3000, 20 veya daha yüksek olan biten bir sorgu vermek için kendisini hazır bulduğunda, sadece durdurmak ve sorgu sorunu yok ki.

Ya ben bir şey eksik?

Update:

MySQL davranır LIMIT fıkra güzel.

Eğer sorguda SQL_CALC_FOUND_ROWS yoksa, MySQL sadece bu yeterli kayıtları sorgu karşılamak için bulduğu kısa sürede vb sıralama, sonuçları ayrıştırma durur.

Eğer böyle bir şey varsa:

SELECT  column 
FROM    table_name 
WHERE   userId=1 
        AND somethingelse='something else'
LIMIT 0, 20

MySQL kriterlerini karşılamak ve durdurmak ilk 20 kayıtlarını almak olacaktır.

Birçok kayıt kriterlere maç nasıl farketmez: 50 veya 1,000,000, performans aynı olacaktır.

Eğer sorgu için ORDER BY ekleyin ve bir dizin yoksa, o zaman MySQL Tabii ilk {[(2)] bulmak için tüm kayıtları göz atmanız gerekir }.

Ancak, bu durumda bile o tür tüm 10,000 olmaz: o üstüne 20 kayıtları ve bir "çalışan pencere" olacak sıralama yalnızca kısa sürede bir kayıt bulursa olarak bu pencere içinde değeri ile penceresine almak için yeterince büyük (ya da küçük).

Bu bütün sayısız sıralama çok daha hızlıdır.

MySQL, ancak ardışık recorsets iyi değil. Bu, bu sorguyu anlamı:

SELECT  column 
FROM    (
        SELECT  column
        FROM    table_name 
        WHERE   userId=1 
                AND somethingelse='something else'
        LIMIT 3000
        )
LIMIT 0, 20

worse performans-bilge ilk olandan.

MySQL, 3,000 kayıtları getirmesi geçici bir tabloda bunları önbelleğe (ya da bellek) ve ancak bundan sonra dış LIMIT geçerli olacaktır.

Öncelikle, LIMIT paramters Ofset ve kayıtların sayısı, bu nedenle ikinci parametre her zaman olması gereken 20 - Eğer bu artırmak gerekmez.

Eğer almak istediğiniz satır üst sınırını bilmek eğer Şüphesiz, sadece, sorguyu çalıştırır mantık içine + Limiti <= 3000 Ofset yani çek bu koyabilirsiniz

Sohnee dedi, yoksa SQL tarafından tüm 3000 kayıtları almak ve daha sonra dizinin parçalarını almak için php array_slice kullanabilirsiniz (kendi gereksinimlerine bağlı olarak).

Sen bir alt sorgu ile elde edebiliriz ...

SELECT name FROM (
   SELECT name FROM tblname LIMIT 0, 3000
) `Results` LIMIT 20, 40

Veya geçici bir tablo ile, bu sayede sıralı olacak geçici satır id, bir geçici tabloya tüm 3000 satırları ardından sayfa seçin.

Eğer php kodu sayfa numarası (20 * p, 20 * p +2) bir fonksiyonu olarak sınırını belirlemek ve 150 sayfa numarası değerini sınırlayabilir.

Yoksa 3000 kayıtları alabilir ve onları jquery sekmeleri kullanarak, sayfa başına on 20 kayıtları bölünmüş.