Question

Je ne suis pas tout à fait sûr que ce soit la bonne approche, telle est ma situation:

J'essaie actuellement de sélectionner 15 galeries, puis de rejoindre la table utilisateur à l'aide de l'id, mais je souhaite également sélectionner une image aléatoire de chaque galerie. Toutefois, d'après ce que je sais, vous ne pouvez pas limiter la jointure gauche ( image) pour ne prendre qu'une image au hasard sans faire de sous-requête.

Voici ce que j’ai eu jusqu’à présent, mais cela ne fonctionne pas comme il se doit:

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

J'ai également essayé de le faire avec Active Record , mais je me suis retrouvé bloqué après deux jointures à gauche, est-il possible de créer une sous-requête ici:

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

J'espère que ce n'est pas trop compliqué, mais je commence vraiment à être déconcerté par toutes les requêtes SQL.

Modifier: Enregistrement actif avec CodeIgniter

Était-ce utile?

La solution

Vous pouvez récupérer une image aléatoire dans une sous-requête:

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

En fonction de votre commentaire, vous pouvez sélectionner une image pour chaque galerie d’une sous-requête. Cela suppose que la table de l'image possède une colonne 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

Autres conseils

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

Cette requête sélectionne une galerie, puis toutes les galeries avec une image (si vous souhaitez renvoyer des galeries sans image, définissez INNER JOIN sur LEFT OUTER JOIN et tout ira bien). Après cela, il rejoint les utilisateurs. Maintenant, bien sûr, ce chiot va retourner chaque galerie frogging quel que soit le nombre d'utilisateurs que vous avez (hourra!). Vous souhaiterez peut-être limiter l'utilisateur dans la clause WHERE (par exemple .- WHERE u.id = 123). Sinon, vous obtiendrez plus de résultats que prévu. Que, ou faire un INNER JOIN sur elle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top