2009-06-28 27 views
5

Ben bu doğru yaklaşım ise oldukça eminim katılır, bu benim durumdur id ama aynı zamanda her galeriden bir rastgele resim seçmek istiyorum, ancak bildiğim kadarıyla bir alt sorgu yapmadan sadece bir rasgele resim almak için sol birleştirmeyi (resim) sınırlayamazsınız. ,mysql alt sorgular ve

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 

Ben de Aktif Record ile bunu denedi ama iki sol birleştirmeler yaptıktan sonra saplanıp mümkündür: Burada

şimdiye kadar var ama olması gerektiği gibi onun çalışmıyor ne buraya bir alt sorgu almak yapmalı: umarım

$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); 

onun dağınık ama gerçekten tüm sql sorgular tarafından kafa karıştırıcı almaya başladım değil ..

Düzenleme: Eğer bir resmi olmadan galerileri dönmek INNER JOIN SOL DIŞ için JOIN değiştirmek istiyorsanız bu sorgu (o zaman bir resim ile herhangi galerisi bulacaksınız dışarı çıkıp bir galeri seçecektir Active Record with CodeIgniter

+0

+1 Aktif Kaydın ilginç bir atıfı için + ... bir bağlantı eklemek için lütfen düzenleme yapabilir misiniz? –

cevap

2

Bir alt sorgu rasgele resim alamadan: Yorumlarınız dayanarak

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 

, bir alt sorguda her Galeri için bir resim seçebilirsiniz. Bu, resim tablosunun bir ID sütunu olduğunu varsayar.

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

Alt sorgulardan iki değişken almak mümkün mü? Tek alacağım "İşlenen 1 sütun (sütunlar) içermelidir" Örneğin, iki alt sorgular yapmadan url ve adı istiyorsam? – Dennis

+0

Böyle bir alt sorgu yalnızca bir sütun (ve bir satır.) Alabilir. Başka hangi sütunları almak istersiniz? – Andomar

+0

Resimden hem URL'yi hem de ismi seçmek istiyorum, bu yüzden bunun için iki alt sorgu yapmam gerekiyor mu? – 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 

, ve iyi olacaksın. Bundan sonra, kullanıcılarla birleştirir. Şimdi, elbette, bu köpek yavrusu, her frigging galerisine sahip olduğunuz birçok kullanıcı için geri dönecektir (hoorah!). Kullanıcıyı WHERE yan tümcesinde sınırlamak isteyebilirsiniz (ör. WHERE u.id = 123). Aksi takdirde, beklediğinizden daha fazla sonuç alacaksınız. Bu, ya da üzerinde bir iç ortak yapmak.

+0

Andomar'ın anlattığı gibi yapmak yerine bir içsel birleştirme yapmak daha iyi midir? – Dennis

+0

Birleştirme, birden çok sütun döndürmenize ve bunları seçtiğiniz ifadede kullanmanıza olanak tanır. Bunun böyle olabileceğini düşündüm, bu yüzden böyle yaptım. – Eric