mysql - Unterabfragen und Joins
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 ..
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.