20 kümesinden maksimum 5 tamsayıları seçin

5 Cevap php

Bir tabloda en son 20 girişlerinin listesi üzerinden 5 en çok izlenen makaleler seçmeye çalışıyorum. Benim tablo yapısı esas şudur:

id | date | title | content | views

Benim ilk düşünce sadece seçin, sonra 20 en son makaleleri almak için bir iç seçeneğini kullanmak için, ama herhangi bir şans var henüz.

//doesn't work (my version of mysql doesn't support LIMIT in sub queries)
$recent = "(SELECT id FROM news ORDER BY date DESC LIMIT 20)";
$result = $db->query("SELECT id, title, date, content FROM news WHERE id IN $recent ORDER BY views DESC LIMIT ".self::RECENT_MAX);

//neither does this (syntax error @ 'OFFSET 20')
$recent = "(SELECT MAX(date) FROM news ORDER BY date DESC OFFSET 20)";
$result = $db->query("SELECT id, title, date, content FROM news WHERE date > $recent ORDER BY views DESC LIMIT ".self::RECENT_MAX);

Herkes bu sorguyu yapısı olacağını konusunda herhangi bir öneriniz var mı?

5 Cevap

Ben sadece bu test edilmiş ve çalışır

SELECT *
FROM (
    SELECT *
    FROM news
    ORDER BY id DESC
    LIMIT 0, 20
) lasttwenty
ORDER BY views DESC
LIMIT 0, 5

Sunucu sürümü: 5.0.51a-3ubuntu5.4

Eğer SQL ile çalışmak alma konularda bir sürü yaşıyorsanız, ben sadece veritabanından en son 20 yazılar kapma öneririm, daha sonra 5 en çok izlenen bulmak için PHP işlemek. Sadece satırlar üzerinde döngü, ya da bir diziye hepsini yüklemek ve sıralamak olabilir.

Ben tek bir sorguda bunu herhangi bir şekilde düşünemiyorum beri, ben kodu üst 5 seçerek, ya da iki sorgu gibi bir şey kullanarak bunu yapıyor ya öneririz:

$items = $db->query("SELECT id FROM news ORDER BY date DESC LIMIT 20");
$recent = array();
foreach ($items->fetchAll() as $item) { $recent[] = $item['id']; }
$recent = "('".join("','", $recent)."')";

$result = $db->query("SELECT id, title, date, content FROM news WHERE id IN {$recent} ORDER BY views DESC LIMIT ".self::RECENT_MAX);

Neden ayrı ayrı ilk (iç) sorgusu çalıştırdığınızda yoktur ve programlı ikinci sorgu oluşturmak?

$ids = array();
$result = $db->query("SELECT id FROM news ORDER BY date DESC LIMIT 20");
while ($row = $result->fetch()) {
    $ids[] = $row[0];
}
$ids = implode(',', $ids);
$result = $db->query("SELECT id, title, date, content FROM news WHERE id IN ($ids) ORDER BY views DESC LIMIT ".self::RECENT_MAX);

Ya da bu doğanın bir şey ...

Update: Yoksa sadece basitçe date, ardından sıralama thr PHP views ile dizi neden, ve nihayet 5 üstteki öğeleri almak olanlar ilk 20 almak olabilir (Ben bu SilentGhost yorumun ne anlama geldiğini sanırım).

Bu deneyin ...

select top 5 number from
(
    select 
    	 top 20 (ID) as number
    from 
    	news order by date desc
)
as number

MS SQL İÇİN EDIT

MySQL için SINIRLAMASINI kullanın