mysql - подзапросы и объединения - PullRequest
5 голосов
/ 28 июня 2009

Я не совсем уверен, что это правильный подход, это моя ситуация:

В настоящее время я пытаюсь выбрать 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

Я также пытался сделать это с Active Record , но я застрял после выполнения двух левых объединений, можно ли получить подзапрос здесь:

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

Edit: Активная запись с CodeIgniter

Ответы [ 2 ]

2 голосов
/ 28 июня 2009

Вы можете получить случайную картинку в подзапросе:

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

На основе вашего комментария вы можете выбрать изображение для каждой галереи в подзапросе. Это при условии, что таблица изображений имеет столбец идентификатора.

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 голос
/ 28 июня 2009
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 (например, - WHERE u.id = 123). В противном случае вы получите больше результатов, чем ожидаете. Это, или сделайте ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...