Frage

Ich bin mir nicht ganz sicher, ob dies der richtige Ansatz ist, das ist meine Situation:

Ich versuche zur Zeit 15 Galerien auswählen und dann links durch die ID mit der Benutzertabelle beitreten, aber ich mag auch von jeder Galerie ein Zufallsbild wählen aber aus dem, was ich weiß, Sie nicht die linke Verknüpfung begrenzen ( Bild) nur eine zufällige Bild aufnehmen, ohne eine Unterabfrage zu tun.

Hier ist, was ich so weit, aber seine nicht funktioniert, wie es sollte:

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

Ich habe auch versucht, dies zu tun mit Active Record , aber ich blieb stecken, nachdem verbindet zwei linke tut, ist es möglich, eine Unterabfrage in hier zu tun bekommen:

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

Ich hoffe, es ist nicht zu chaotisch, aber ich fange wirklich verwirrend zu erhalten, indem alle SQL-Abfragen ..

Edit: Active Record mit CodeIgniter

War es hilfreich?

Lösung

Sie können ein zufälliges Bild in einer Unterabfrage holen:

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

Basierend auf Ihrem Kommentar, können Sie ein Bild für jede Galerie in einer Unterabfrage auswählen. Dies wird unter der Annahme, das Bild Tabelle eine ID-Spalte hat.

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

Andere Tipps

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

Diese Abfrage wird gehen und wählen Sie eine Galerie, dann wird es jede Galerie mit einem Bild finden (wenn Sie Galerien zurückzukehren, ohne ein Bild mögen, INNER LEFT OUTER JOIN ändern JOIN, und Sie werden in Ordnung). Danach schließt sich er es mit Benutzer. Nun, natürlich, dieser Welpe wird jede frigging Galerie zurückzukehren für wie viele Benutzer Sie haben (hoorah!). Möglicherweise möchten Sie den Benutzer in der WHERE-Klausel (z-WHERE u.id = 123) begrenzen. Sonst wirst du weitere Ergebnisse bekommen, als man erwarten würde. Das, oder kann eine INNER JOIN auf sie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top