2009-06-28 15 views
5

ich nicht ganz sicher bin, ob dies der richtige Ansatz ist, das ist meine Situation:mysql - Subqueries und schließt sie

Ich bin derzeit versucht, 15 Galerien auswählen und dann nach links mit dem Tisch Benutzer verbinden durch die id, aber ich möchte auch ein zufälliges Bild aus jeder Galerie auswählen, aber von dem, was ich weiß, kann man den linken Join (Bild) nicht begrenzen, um nur ein zufälliges Bild aufzunehmen, ohne eine Unterabfrage zu machen. Hier

ist, was ich so weit gekommen, 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 auch versucht, dies zu tun mit Active Record aber ich blieb stecken nachdem ich zwei linke verbindet, ist es möglich, zu tun, um eine Unterabfrage bekommt hier: von allen sQL-Abfragen

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

Edit: Active Record with CodeIgniter

+0

+1 für interessante Zitat von Active Record ... Könnten Sie bitte bearbeiten, um einen Link aufzunehmen? –

Antwort

2

Sie könnten 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 

auf Ihrem Kommentar Basierend Sie ein Bild für jede Galerie in einer Unterabfrage wählen könnten. Dies setzt voraus, dass die Bildtabelle 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 
+0

Können zwei Variablen aus den Unterabfragen abgerufen werden? Alles, was ich bekomme, ist "Operand sollte 1 Spalte (n) enthalten" Zum Beispiel, wenn ich die URL und den Namen ohne zwei Unterabfragen wollen? – Dennis

+0

Eine solche Unterabfrage kann nur eine Spalte (und eine Zeile) abrufen. Welche andere Spalte möchten Sie abrufen? – Andomar

+0

Ich möchte sowohl die URL als auch den Namen aus dem Bild auswählen, also muss ich zwei Unterabfragen dafür machen? – Dennis

1
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 gehen wird und eine Galerie auswählen, dann wird es jede Galerie mit einem Bild finden (wenn Sie ohne Bild Galerien zurückkehren möchten, INNER LEFT OUTER JOIN ändern JOIN, und dir wird es gut gehen). Danach schließt es sich den Benutzern an. Nun, natürlich wird dieser Welpe jede neue Galerie für so viele Benutzer zurückgeben, wie Sie haben (hurra!). Möglicherweise möchten Sie den Benutzer in der WHERE-Klausel einschränken (z. B. WHERE u.id = 123). Sonst werden Sie mehr Ergebnisse erzielen, als Sie erwarten würden. Das, oder mach einen INNEREN JOIN drauf.

+0

Ist es besser, eine innere Verbindung zu machen, als Andomar zu erklären? – Dennis

+0

Mit dem Join können Sie mehrere Spalten zurückgeben und diese in Ihrer SELECT-Anweisung verwenden. Ich dachte, das könnte der Fall sein, weshalb ich es so gemacht habe. – Eric

Verwandte Themen