2016-07-28 12 views
5

मैं SELECT यादृच्छिक पृष्ठों है कि इसे पसंद किया नहीं किया गया है या एक निश्चित उपयोगकर्ता (uid उपयोगकर्ता के आईडी) द्वारा भी पसंद नहीं करने के लिए कोशिश कर रहा हूँ।एक विशिष्ट एसक्यूएल स्तंभ को शामिल न करें? अभी तक:

मेरे तालिका संरचना:

OneNight_pages: (आईडी, शीर्षक) OneNight_pages_likes: (आईडी, page_id, यूआईडी, स्थिति)

और यह कैसे मैं एक यादृच्छिक पृष्ठ पाने की कोशिश की है:

SELECT 
p.id AS page_id, 
p.title, 
SUM(CASE WHEN l.page_id = p.id AND status = '1' THEN 1 ELSE 0 END) AS likes, 
SUM(CASE WHEN l.page_id = p.id AND status = '0' THEN 1 ELSE 0 END) AS dislikes 

FROM OneNight_pages_likes l 
LEFT JOIN OneNight_pages p on l.page_id = p.id 
WHERE l.uid != '1' 
GROUP BY page_id 
ORDER BY rand() 
LIMIT 1 

हालांकि यह अभी भी उन पृष्ठों को प्रदर्शित करेगा जिन्हें मैं पहले से पसंद या नापसंद करता हूं, क्योंकि WHERE l.uid != 1 पूरे l.page_id को बाहर करने के लिए प्रभावित नहीं होता है (क्योंकि किसी विशेष पृष्ठ_आई के लिए अन्य पसंद और नापसंद हैं घ)।

मुझे लगता है मैं एक सबक्वेरी के साथ इस को हल करने के पहले कुछ विशेष एल्गोरिथ्म एक पेज आईडी प्राप्त करने या उपयोग करने की आवश्यकता है लगता है? मैं भी भंडारण के सभी पसंद है और कुकी या सत्र में एक सरणी के रूप में भी पसंद नहीं पृष्ठों के बारे में सोचा है, लेकिन मुझे लगता है कि अगर सही है या कारगर तरीका यह करने के लिए नहीं जानता?

+0

आप नमूना डेटा उपलब्ध कराने और अपेक्षित परिणाम कर सकते हैं? समझने में कठिनाई हो रही है ... – sgeddes

उत्तर

4

आप यही चाहते है?

select p.* 
from OneNight_pages p 
where not exists (select 1 
        from OneNight_pages_likes l 
        where l.page_id = p.id and l.uid = '1' 
       ) 
order by rand() 
limit 1; 

यह एक यादृच्छिक पृष्ठ का चयन करता है जहां उपयोगकर्ता "1" की पसंद तालिका में कोई पंक्ति नहीं होती है।

संपादित करें:

आपकी क्वेरी पर यह परिवर्तन एक ही बात के बारे में क्या करना चाहिए:

SELECT p.id AS page_id, p.title, 
     SUM(CASE WHEN status = '1' THEN 1 ELSE 0 END) AS likes, 
     SUM(CASE WHEN status = '0' THEN 1 ELSE 0 END) AS dislikes 
FROM OneNight_pages p LEFT JOIN 
    OneNight_pages_likes l 
    ON l.page_id = p.id 
GROUP BY page_id 
HAVING SUM(l.uid = 1) = 0 
ORDER BY rand() 
LIMIT 1; 

पिछले संस्करण में बेहतर प्रदर्शन करना चाहिए था।

+0

आपके उत्तर के लिए धन्यवाद। ऐसा लगता है कि केवल उन पृष्ठों को दिखाएं जिन्हें अभी पसंद नहीं किया गया है। तो मुझे केवल एक विशिष्ट उपयोगकर्ता को छोड़कर केवल किसी भी पसंद या नापसंद के बिना पृष्ठ मिलते हैं? – AlexioVay

+1

@ वाया। । । यह केवल एक विशेष उपयोगकर्ता द्वारा पसंद को बाहर करना चाहिए। –

+1

आप सही हैं, धन्यवाद! मैंने 'l.uid = '1'' – AlexioVay

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