mysql - alt sorgular ve birleşimler

2 Cevap php

Bu doğru bir yaklaşım ise oldukça emin değilim, bu benim durum:

Şu anda 15 galerileri seçmek için çalışıyor ve ardından id aracılığıyla kullanıcının tablo ile katılmak bıraktı ama ben de hiç ancak ben sol join (resim) sınırı olamaz bildiklerini her galeriden biri rastgele resim seçmek istiyorum değilim sadece bir alt sorgu yapmadan bir rasgele resim pick up.

İşte ben bugüne kadar var ama onun olması gerektiği gibi çalışmıyor budur:

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 Active Record ile yapmaya çalıştım ama ben iki sol katılır yaptıktan sonra saplanıp, burada bir alt sorgu almak yapmak mümkün:

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

Ben onun dağınık değil umut ama ben gerçekten tüm sql sorgular tarafından kafa karıştırıcı başlıyorum ..

Edit: Active Record with CodeIgniter

2 Cevap

Bir sorguda rastgele bir resim almak olabilir:

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

Yorumlarınız dayanarak, bir alt sorgu her galeri için bir resim seçebilirsiniz. Bu resim tablo, bir kimlik sütunu vardır üstleniyor.

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

Bu sorgu (Eğer bir resim olmadan galerileri dönmek INNER JOIN SOL DIŞ JOIN değiştirmek isterseniz, ve iyi olacak), bir resim ile herhangi bir galeri bulacaksınız, dışarı çıkmak ve bir galeri seçecektir. Bundan sonra, kullanıcılar ile birleşir. Şimdi, tabii, bu köpek yavrusu (hoorah!) var ancak pek çok kullanıcı için her frigging galerisi geri gidiyor. Sen WHERE yan tümcesinde kullanıcıyı sınırlamak isteyebilirsiniz (örneğin-WHERE u.id = 123). Aksi takdirde, size beklediğinizden daha fazla sonuç almak için gidiyoruz. Yani, ya bir INNER üzerinde JOIN yok.