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