문제

이것이 올바른 접근법인지 확실하지 않습니다. 이것이 내 상황입니다.

나는 현재 15 개의 갤러리를 선택하려고 시도한 다음 ID를 통해 사용자 테이블과 결합하려고하지만 각 갤러리에서 하나의 임의의 사진을 선택하고 싶지만 왼쪽 조인 (그림)을 제한 할 수 없다는 것을 알고 있습니다. 하위 퀘스트를하지 않고 무작위 사진을 하나만 선택하십시오.

여기에 내가 지금까지 얻은 것이 있지만 그대로 작동하지 않습니다.

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 쿼리에 의해 혼란스러워지기 시작했습니다 ..

편집하다:Codeigniter와의 활성 레코드

도움이 되었습니까?

해결책

하위 퀘스트에서 임의의 그림을 가져올 수 있습니다.

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

다른 팁

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

이 쿼리는 나가서 갤러리를 선택하면 사진이있는 갤러리가 있습니다 (사진없이 갤러리를 반환하려면 왼쪽 외부 조인으로의 내부 조인을 변경하면 괜찮을 것입니다). 그 후에는 사용자와 합류합니다. 물론,이 강아지는 많은 사용자를 위해 모든 프리깅 갤러리를 반환 할 것입니다 (Hoorah!). WHERE 절 (예 :WHERE u.id = 123). 그렇지 않으면, 당신은 당신이 기대하는 것보다 더 많은 결과를 얻을 것입니다. 또는 내부에 가입합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top