2010-02-06 12 views
5

मेरे पास एक MYSQL5 डेटाबेस और PHP 5. है। मुझे गेम वेबसाइट इंडेक्स पेज के लिए एक क्वेरी चाहिए जो केवल प्रत्येक श्रेणी के गेम से पहले 12 का चयन करे। यह है, जो कि अभी तक मेरे पास है।उन्नत एसक्यूएल क्वेरी। प्रत्येक श्रेणी से शीर्ष 12 (MYSQL)

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

PHP कोड तब एक ही श्रेणी के समूह को एक साथ समूहित करता है और उन्हें प्रदर्शित करता है। लेकिन हाँ, यह प्रत्येक श्रेणी से खेल की संख्या को सीमित नहीं करता है जैसा मैं चाहता हूं।

यहाँ एकदम वही है जिसे तालिका की संरचना लगता है: i49.tinypic.com/aysoll.png

यहाँ एक ब्लॉग पोस्ट जो मुझे क्या करना है कोशिश कर रहा हूँ की तरह लगता है है: http://www.e-nformation.net/content/view/title/MySQL+Top+N+in+each+group+(group+inner+limit) लेकिन मैं नहीं कर सकता इसका अर्थ बनाओ।

किसी भी मदद की सराहना की जाती है।

उत्तर

1

इस बारे में कैसे?

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 
+0

कुछ अन्य समाधान काम करते हैं लेकिन मुझे लगता है कि यह सबसे अच्छा है। धन्यवाद। – Neddy

0

आपके द्वारा उल्लिखित पदों से तकनीक का उपयोग करने के लिए, आपको गेम ऑर्डर करने का एक तरीका चाहिए। वे लेख की तारीख का उपयोग कर रहे हैं। फिर वे उस कंपनी के लिए पुराने लेखों की संख्या का चयन करते हैं, और कहते हैं कि तीन से अधिक नहीं हो सकते हैं।

अपने खेल मेज एक स्वत: वेतन वृद्धि स्तंभ id कहा जाता है, तो आप शीर्ष 10 की तरह प्रत्येक श्रेणी के खेल का चयन कर सकते हैं:

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 हालत का कहना है कि वहाँ के साथ 10 से अधिक पंक्तियों नहीं किया जा सकता एक ही श्रेणी और एक उच्च आईडी।

+0

आह, लेख के लिंक का पालन नहीं किया: यहाँ शायद सबसे उपयोगी संसाधन है। यह अधिक सुरुचिपूर्ण होगा - लेकिन शायद अधिक मन युद्ध - इसे करने का तरीका। –

0

एक और अधिक सुरुचिपूर्ण समाधान हो सकता है, लेकिन आप प्रत्येक श्रेणी के लिए केवल एक क्वेरी निष्पादित कर सकते हैं।

SELECT DISTINCT(category) FROM `games`; 

फिर 12 पंक्तियों के लिए परिणाम और क्वेरी से प्रत्येक ले:: सबसे पहले श्रेणियों की एक सूची प्राप्त

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

आप (यह द्वारा और व्यवस्था) पंक्ति में रैंकिंग के कुछ प्रकार जोड़ने की जरूरत प्राप्त करने के लिए शीर्ष 12.

नोट: किसी एक क्वेरी के साथ ऐसा करने के लिए एक रास्ता हो सकता है, लेकिन यह मुझे इस समय निकल जाता है।

1

आप, UNION इस्तेमाल कर सकते हैं अगर हम प्रकार के बारे में दस लाख में बात नहीं कर रहे हैं ...

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) 

आप अपने PHP में श्रेणियों की सरणी है, तो/एएसपी, आप फ्लाई पर इस संघ को उत्पन्न कर सकते हैं।

अधिक: http://dev.mysql.com/doc/refman/5.0/en/union.html

संपादित करें: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

अच्छी तरह से इसका इस्तेमाल ^^

संबंधित मुद्दे