5

これが正しいアプローチであるかどうかはよくわかりません。これが私の状況です。

現在、15 のギャラリーを選択して、id を使用してユーザー テーブルに結合しようとしていますが、各ギャラリーから 1 つのランダムな画像を選択したいのですが、左の結合 (画像) を制限できないことがわかっています。サブクエリを実行せずにランダムな画像を 1 つだけピックアップします。

これは私がこれまでに得たものですが、正常に機能していません:

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

私もActive Recordでこれをやろうとしましたが、2つの左結合を行った後に行き詰まりました。ここでサブクエリを取得することは可能ですか:

$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クエリで本当に混乱し始めています..

編集: CodeIgniterを使用したアクティブレコード

4

2 に答える 2

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

コメントに基づいて、サブクエリで各ギャラリーの画像を選択できます。これは、picture テーブルに 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
于 2009-06-28T19:01:53.183 に答える
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 に変更すれば問題ありません)。その後、ユーザーと合流します。さて、もちろん、この子犬は、あなたが持っているユーザーの数に関係なく、すべてのフリギング ギャラリーを返します (やったー!)。WHERE 句 (eg-) でユーザーを制限したい場合がありますWHERE u.id = 123。そうしないと、予想以上の結果が得られます。それ、またはそれにINNER JOINを実行します。

于 2009-06-28T18:41:20.740 に答える