Domanda

Non sono del tutto sicuro che questo sia l'approccio giusto, questa è la mia situazione:

Attualmente sto provando a selezionare 15 gallerie e poi ho lasciato unire con la tabella utente attraverso l'id ma voglio anche selezionare un'immagine casuale da ogni galleria, tuttavia da quello che so non puoi limitare il join sinistro ( foto) per raccogliere solo una foto casuale senza fare una subquery.

Ecco cosa ho ottenuto finora, ma non funziona come dovrebbe:

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

Ho anche provato a farlo con Record attivo ma mi sono bloccato dopo aver fatto due join a sinistra, è possibile ottenere una sottoquery qui:

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

Spero che non sia disordinato ma sto davvero iniziando a confondermi con tutte le query sql ..

Modifica: Record attivo con CodeIgniter

È stato utile?

Soluzione

Puoi recuperare un'immagine casuale in una sottoquery:

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

In base al tuo commento, puoi selezionare un'immagine per ogni galleria in una sottoquery. Ciò presuppone che la tabella delle immagini abbia una colonna 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

Altri suggerimenti

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

Questa query uscirà e selezionerà una galleria, quindi troverà qualsiasi galleria con una foto (se vuoi restituire le gallerie senza una foto, cambia INNER JOIN in LEFT OUTER JOIN e andrà tutto bene). Successivamente, si unisce agli utenti. Ora, naturalmente, questo cucciolo restituirà tutte le gallerie per tutti gli utenti che hai (hoorah!). Potresti voler limitare l'utente nella clausola WHERE (ad es .- WHERE u.id = 123). Altrimenti, otterrai più risultati di quanto ti aspetti. Quello, o fai un INNER JOIN su di esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top