2012-03-30 2 views
1

Ich habe eine Online-Anwendung für die ich eine Art Dashboard (um den Leerraum zu verwenden) benötigen.mysql: Gruppenergebnisse, begrenzen sie und verbinden zu anderen Tabellen in einer Abfrage

Es gibt drei Tabellen für den Betrieb verwendet:

1.) categories: id, name 
2.) entries: id, name, description, category_id, created, modified 
3.) entryimages: id, filename, description, entry_id 

auf dem Armaturenbrett i 4-5 Einträge angezeigt werden sollen (mit Miniaturbildern, so dass ich erfordern schließt sich an die entryimages Tabelle und der Tabelle Kategorien) für jede Kategorie.

ich durch einige Artikel zu lesen (und Threads auf so) wie diese: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

Aber ich immer noch nicht, es richtig zu machen, ich habe alle Kategorien zum ersten Extrakt versucht und für eine jede und jeder Kategorie bauen abfragen und mit "all union" anhängen, aber das funktioniert nicht. Die letzte Version von Code i verwendet:

foreach($categories as $id => $name) 
{ 
    $query .= "SELECT `entry`.`id`, 
      `entry`.`name`, 
      `entry`.`description`, 
      `entry`.`category_id`, 
      `entry`.`created`, 
      `entry`.`modified`, 
      `entryimages`.`filename`, 
      `entryimages`.`description` 
      FROM `entries` as `entry` LEFT JOIN `entryimages` ON `entryimages`.`entry_id` = `entry`.`id` 
WHERE `entry`.`category_id` = $id "; 

      if($i < count($groups)) 
      { 
       $query .= 'UNION ALL '; 
      } 

      $i++; 
     } 

     $result = mysql_query($query); 

Weiß jemand, was das beste Recht vor, diese Operation zu erreichen?

Dank 1000

Antwort

1

Auf dem Armaturenbrett zu erhalten Wenn Sie drei Einträge anzeigen möchten, ist die Vorgehensweise falsch. Wenn mein Verständnis richtig ist, wird die gesamte Abfrage so etwas wie

"SELECT `entry`.`id`, 
     `entry`.`name`, 
     `entry`.`description`, 
     `entry`.`category_id`, 
     `entry`.`created`, 
     `entry`.`modified`, 
     `entryimages`.`filename`, 
     `entryimages`.`description` 
    FROM `entries` as `entry` 
    INNER JOIN categories 
     ON (entry.category_id = categories.id) 
    LEFT JOIN (SELECT * FROM `entryimages` WHERE `entry_id` = `entry`.`id` LIMIT 1) AS `entryimages` 
     ON `entryimages`.`entry_id` =`entry`.`id`  
    ORDER BY `entry`.`created` DESC LIMIT 5"; 
+0

Danke, das tat es! =) –

1

Ihr Code für mich in Ordnung aussieht, sollten Sie nur eine LIMIT-Klausel hinzufügen, so dass Sie nur fünf von ihnen bekommen und eine ORDER BY-Klausel die neuesten

$query .= "SELECT `entry`.`id`, 
     `entry`.`name`, 
     `entry`.`description`, 
     `entry`.`category_id`, 
     `entry`.`created`, 
     `entry`.`modified`, 
     `entryimages`.`filename`, 
     `entryimages`.`description` 
     FROM `entries` as `entry` LEFT JOIN `entryimages` ON `entryimages`.`entry_id` =   `entry`.`id`  
WHERE `entry`.`category_id` = $id ORDER BY `entry`.`created` DESC LIMIT 5"; 
+0

Danke, gut für die Bestellung von i verwenden ränder() 5 zufällig diejenigen zu bekommen .. =) –

Verwandte Themen