Gelişmiş SQL sorgusu.

4 Cevap php

Ben bir MySQL5 veritabanı ve PHP 5 var. Ben sadece oyunların her kategoriden ilk 12 seçer oyun siteleri index sayfası için bir sorgu gerekir. İşte ben bugüne kadar ne var.

$db->query("SELECT * FROM  `games` WHERE status = 'game_published'  AND `featured` =  '1' ORDER BY `category`");

Birlikte ve bunları görüntüler aynı kategorideki php kodu daha sonra gruplar oyunları. Ben istediğim gibi ama evet, her kategoriden oyun sayısını sınırlamak değil.

I49.tinypic.com/aysoll.png: Burada tablosunun yapısı benzer tam olarak ne

http://www.e-nformation.net/content/view/title/MySQL+Top+N+in+each+group+(group+inner+limit) Ama ben bunu anlam veremiyorum: İşte yapmak çalışıyorum ne gibi sesler bir blog yazısı.

Herhangi bir yardım takdir edilmektedir.

4 Cevap

Bu nasıl?

SELECT * FROM (
    SELECT
       games.*,
       @rn := CASE WHEN @category=category THEN @rn + 1 ELSE 1 END AS rn,
       @category := category
    FROM games, (SELECT @rn := 0, @category := NULL) AS vars
    WHERE status = 'game_published' AND featured = '1'
    ORDER BY category
) AS T1
WHERE rn <= 12

Biz yaklaşık milyon türlerinden bahsediyoruz değil eğer, UNION kullanabilirsiniz ...

pseudoSQL:

(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10)
UNION
(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10)
UNION
(SELECT * FROM table WHERE condition AND category = 'action' ORDER BY id LIMIT 10)

Eğer PHP / ASP kategorilerin dizi varsa, anında bu birliği oluşturabilir.

More: http://dev.mysql.com/doc/refman/5.0/en/union.html

EDIT: Here's probably most useful resource: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

^ ^ Iyi kullanın

Orada daha zarif bir çözüm olabilir, ama sadece her kategori için bir sorgu yürütebilir. İlk kategorilerin bir listesini almak:

SELECT DISTINCT(category) FROM  `games`;

Sonra her sonuç almak ve 12 satır için sorgu:

SELECT * FROM games WHERE status = 'game_published'  
AND `featured` =  '1' AND `category` = $category LIMIT 12;

Tabii ki top 12 almak için bazı rütbeli satır tür (ve düzeni onun tarafından) eklemeniz gerekir.

Note: Orada tek bir sorgu ile bunu yapmak için bir yol olabilir, ama şu anda bana kaçar olabilir.

Eğer söz görevlerinden tekniği kullanmak için, oyun sipariş için bir yol gerekir. Onlar makale tarihini kullanarak ediyoruz. Sonra o şirket için eski makale numarasını seçin, ve üçten fazla olamaz söylüyorlar.

Oyunların masa denilen bir otomatik artım sütunu varsa id, sizin gibi kategori başına en iyi 10 oyun seçebilirsiniz:

SELECT   *
FROM     games g1
WHERE    status = 'game_published'  
         AND featured = '1' 
         AND 10 > 
         (
         SELECT   COUNT(*)
         FROM     games g2
         WHERE    g2.status = 'game_published'  
                  AND g2.featured = '1' 
                  AND g1.category = g2.category
                  AND g2.id > g1.id
         )

where durumu 10'dan fazla aynı kategori ile satır ve daha yüksek bir kimlik olamaz diyor.