2009-06-28 20 views
5

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

SELECT galleries.id, galleries.name, users.username, pictures.url 
FROM galleries 
LEFT JOIN users ON users.id = galleries.user_id 
LEFT JOIN pictures ON (
    SELECT pictures.url 
    FROM pictures 
    WHERE pictures.gallery_id = galleries.id 
    ORDER BY RAND() 
    LIMIT 1) 
WHERE active = 1 
ORDER BY RAND() 
LIMIT 15 

मैं भी सक्रिय रिकॉर्ड के साथ ऐसा करने की कोशिश की लेकिन मैं कर दो बाईं मिलती है के बाद अटक गया यह संभव है:

यहाँ मैं अब तक क्या मिला है, लेकिन इसके काम नहीं कर एकदम सही ढंग से है यहाँ में एक सबक्वेरी प्राप्त करने के लिए:

$this->db->select('galleries.id, galleries.name, users.id as user_id, users.username'); 
$this->db->from('galleries'); 
$this->db->join('users', 'users.id = galleries.user_id','left'); 
$this->db->join('pictures','pictures.gallery_id = galleries.id AND','left'); 
$this->db->where('active',1); 

मुझे आशा है कि अपने गन्दा करने के लिए नहीं है, लेकिन मैं वास्तव में सभी एसक्यूएल प्रश्नों द्वारा भ्रामक पाने के लिए शुरू कर ..

संपादित करें: Active Record with CodeIgniter

+0

सक्रिय रिकॉर्ड के दिलचस्प उद्धरण के लिए +1 ... क्या आप कृपया एक लिंक शामिल करने के लिए संपादित कर सकते हैं? –

उत्तर

2

आप एक सबक्वेरी में एक यादृच्छिक चित्र लाने सकता है:

select 
    g.name, u.username, 
    (select url from pictures p where p.gallery_id = g.gallery_id 
    order by rand() limit 1) as url 
from galleries g 
left join users u on g.user_id = u.id 
where g.active = 1 

अपनी टिप्पणी के आधार पर, आप एक सबक्वेरी में प्रत्येक गैलरी के लिए एक चित्र का चयन कर सकते हैं। यह माना जाता है कि चित्र तालिका में एक आईडी कॉलम है।

select 
    g.name, u.username, p.url, p.name 
from (
    select id, user_id, name, 
     (select id from pictures p 
     where p.gallery_id = g.gallery_id 
     order by rand() limit 1) as samplepictureid 
    from galleries 
    where g.active = 1 
) g 
left join users u on g.user_id = u.id 
left join pictures p on p.id = g.samplepictureid 
+0

क्या उप-प्रश्नों से दो चर पुनर्प्राप्त करना संभव है? मुझे बस इतना मिलता है कि "ऑपरेंड में 1 कॉलम होना चाहिए" उदाहरण के लिए यदि मैं दो उप-प्रश्नों के बिना यूआरएल और नाम चाहता हूं? – Dennis

+0

इस तरह की एक सबक्वायरी केवल एक कॉलम (और एक पंक्ति) पुनर्प्राप्त कर सकती है। आप कौन सा कॉलम पुनर्प्राप्त करना चाहते हैं? – Andomar

+0

मैं तस्वीर से यूआरएल और नाम दोनों का चयन करना चाहता हूं, इसलिए मुझे इसके लिए दो उप-प्रश्न करना है? – Dennis

1
SELECT 
    g.id, 
    g.name, 
    u.username, 
    p.url 
FROM 
    galleries g 
    INNER JOIN (SELECT DISTINCT 
     gallery_id, 
     (SELECT url FROM pictures ss WHERE ss.gallery_id = s.gallery_id 
      ORDER BY RAND() LIMIT 1) AS url 
    FROM 
     pictures s) p ON 
     g.id = p.gallery_id 
    LEFT OUTER JOIN users u ON 
     g.user_id = u.id 
WHERE 
    g.active = 1 

इस क्वेरी बाहर जाना और एक गैलरी का चयन करेंगे, तो यह एक तस्वीर के साथ किसी भी गैलरी मिलेगा (यदि आप, एक तस्वीर के बिना दीर्घाओं लौट चेंज इनर वाम बाहरी करने के लिए शामिल हों शामिल हों करना चाहते हैं, और तुम ठीक हो जाओगे)। उसके बाद, यह उपयोगकर्ताओं के साथ इसमें शामिल हो जाता है। अब, ज़ाहिर है, यह पिल्ला आपके पास कई उपयोगकर्ताओं के लिए हर फ्रिगिंग गैलरी वापस करने जा रही है (हुराह!)। आप उपयोगकर्ता को WHERE क्लॉज (उदा .- WHERE u.id = 123) में सीमित करना चाह सकते हैं। अन्यथा, आप अपेक्षा से अधिक परिणाम प्राप्त करने जा रहे हैं। वह, या उस पर एक इंटर्न जॉइन करें।

+0

एंडोमर समझाए जाने के बजाए आंतरिक प्रवेश करना बेहतर है? – Dennis

+0

जॉइन आपको कई कॉलम वापस करने और आपके चयन कथन में उन लोगों का उपयोग करने की अनुमति देता है। मुझे लगा कि यह मामला हो सकता है, यही कारण है कि मैंने ऐसा किया। – Eric

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