MyBB.de Forum

Normale Version: Gruppierte Datenbank-Abfrage
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

ich bin schon leicht am verzweifeln  Shy

Ich versuche eine DB Abfrage zu erstellen, die mir alle, nach Post-ID gruppierte, Bild-Anhänge ausgibt...dazu das Ganze noch mit Multipage Option.

Grundsätzlich funktioniert meine Abfrage, nur leider liefert die Ausgabe nur einen Anhang pro PID aus, obwohl wissentlich mehrere vorhanden sind.

Das gesetzte LIMIT soll sich auf die PIDs beziehen, also z.B. alle Bilder der ersten 10 einzigartigen PIDs.

Hier meine PHP Funktion:
PHP-Code:
$where "WHERE a.thumbnail != '' AND a.thumbnail != 'SMALL'";
 
$where .= " AND a.uid = {$uid} AND p.uid = {$uid}";
 
$where .= " AND a.visible = 1 AND p.visible = 1";

 
$unviewable get_unviewable_forums();
 if(
$unviewable)
 {
 
$where .= " AND p.fid NOT IN ($unviewable)";
 }
 
$inactive get_inactive_forums();
 if(
$inactive)
 {
 
$where .= " AND p.fid NOT IN ($inactive)";
 }

$query $db->query("
 SELECT a.pid, a.aid, a.thumbnail, a.filename, p.tid, p.subject
 FROM "
.TABLE_PREFIX."attachments a
 LEFT JOIN "
.TABLE_PREFIX."posts p ON (p.pid = a.pid)
 
{$where}
 GROUP BY a.pid
 ORDER BY a.pid DESC, a.aid ASC
 LIMIT 
{$start}{$per_page}
 "
); 

Entferne ich das:
PHP-Code:
GROUP BY a.pid 

wird werden alle Bilder ausgegeben, nur leider bezieht sich das LIMIT dann auf die Bilder und nicht auf die PIDs.

Eventuell hat jemand schon eine Lösung für solch eine Abfrage gefunden.
Deine Anforderungen beißen sich. Du kannst nicht gleichzeitig Gruppieren und trotzdem alle Unter-Einträge so einfach abfragen. Zu Ansätzen mit z.B. GROUP_CONCACT würde ich an dieser Stelle nicht raten.
Üblicherweise löst man so etwas PHP-seitig. Erst eine Abfrage nach Beiträgen mit Attachments (mit LIMIT) und in der 2. Abfrage lädt man alle Attachments zu diesen Beiträgen.
folgendes habe ich auch schon versucht:
PHP-Code:
$query $db->query("
 SELECT DISTINCT a.pid, a.aid, a.thumbnail, a.filename, p.tid, p.subject
 FROM "
.TABLE_PREFIX."attachments a
 LEFT JOIN "
.TABLE_PREFIX."posts p ON (p.pid = a.pid)
 
{$where}
 ORDER BY a.pid DESC, a.aid ASC
 LIMIT 
{$start}{$per_page}
 "
); 

....leider ohne das gewünschte Ergebnis.

EDIT:
Danke für die schnelle Rückmeldung, Stefan

Das war auch meine Überlegung, nur hätte ich dann wohl sehr viele Datenbankabfragen pro Seite, das wollte ich mit so einer kombinierten Abfrage eigentlich vermeiden.

z.B. bei einem Limit von 10 hätte ich min. 11 Einzel-Query's
Die Anzahl an Abfragen lässt sich durch Optimierung auf 2 reduzieren. So in etwa (ungetestet):
PHP-Code:
$posts = array();
$query $db->query("
    SELECT p.pid, p.tid, p.subject
    FROM "
.TABLE_PREFIX."posts p
    WHERE EXISTS(SELECT a.* FROM "
.TABLE_PREFIX."attachments a WHERE p.pid=a.pid)
    ORDER BY p.dateline DESC
    LIMIT 
{$start}{$per_page}
"
);
while(
$post $db->fetch_array($query))
{
    
$post['attachments'] = array();
    
$posts[$post['pid']] = $post;
}

if(empty(
$posts))
{
    
error("Keine Beiträge gefunden, blah blah");
}

$query $db->simple_select('attachments''*''pid IN ('.implode(','array_keys($posts)).')', array('order_by' => 'aid'));
while(
$attachment $db->fetch_array($query))
{
    
$posts[$attachment['pid']]['attachments'][] = $attachment;
}

foreach(
$posts as $post)
{
    foreach(
$post['attachments'] as $attachment)
    {
        
// Hier kommt dein Code
        // du kannst auf $post und $attachment zugreifen
    
}

Danke dir für deine Mühe, Stefan....ich werde das gleich mal testen und berichten
Klasse Stefan....funktioniert TOP! .... Vielen Dank nochmal!!
Wunderbar. Smile Ich habe den Code oben noch etwas aufgeräumt (die Variable $attachments entfernt), aber funktionell macht das keinen Unterschied.
Das ist nicht so tragisch, denn ich musste die Abfragen sowieso an das restliche Script anpassen.

Mir ging es um eine grundsätzliche Vorgehensweise und deine funktioniert einwandfrei.

....jetzt kann ich mich an das Styling der Ausgaben machen. Wink


Danke nochmal!