2009-06-28 65 views
5

我不太清楚,如果这是正确的做法,这是我的情况:MySQL的 - 子查询,并加入

目前,我想要选择15个画廊,然后离开与用户表连接它通过编号,但我也想从每个画廊中选择一张随机图片,但是我知道你不能限制左连接(图片)只拾取一张随机图片而不做子查询。

这是我走到这一步,但它不是,它应该工作:

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

我希望它不要混乱,但我真的开始通过所有的SQL查询来获得混乱..

编辑: Active Record with CodeIgniter

+0

+1有趣的引用的活动记录...你可以请编辑包括一个链接? – 2009-06-28 18:25:29

回答

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 

基于您的评论,你可以选择在一个子查询每家画廊的图片。这是假设图片表有一个ID列。

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

,如果你想没有一个画面返回画廊,改变INNER JOIN到LEFT OUTER JOIN这个查询将走出去,选择一个画廊,这时就会发现与图片任何画廊(,你会没事的)。之后,它与用户一起加入。现在,当然,这只小狗将会为无论你拥有多少用户(hoorah!)而返回每个frigging画廊。您可能希望将用户限制在WHERE子句中(例如 - WHERE u.id = 123)。否则,你会得到比预期更多的结果。那,或者做一个INNER JOIN就可以了。

+0

做一个内部连接而不是像Andomar解释的那样做更好? – Dennis 2009-06-28 19:17:04

+0

连接允许您返回多个列并在select语句中使用这些列。我想这可能是这种情况,这就是我为什么那样做的原因。 – Eric 2009-06-29 13:19:42