我有一个在线申请,我需要一种仪表板(使用白色空间)。
有三个表用于操作:
1.) categories: id, name
2.) entries: id, name, description, category_id, created, modified
3.) entryimages: id, filename, description, entry_id
仪表板上的我希望为每个类别显示4-5个条目(包含缩略图图像,因此我需要连接到entryimages表和类别表)。
我通读了一些文章(和s.o.上的主题),如下所示: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/
但我仍然没有做对,我试图首先提取所有类别,并为每个类别构建一个查询和“所有联盟”将它们附加到一个,但这是行不通的。 我使用的最后一个代码版本:
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);
有谁知道完成此操作的最佳权利是什么?
感谢1000
答案 0 :(得分:1)
你的代码对我来说没问题,你应该只添加一个LIMIT子句,这样你只需要五个子句和一个ORDER BY子句来获取最新的
$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";
答案 1 :(得分:1)
在仪表板上,如果要显示三个条目,那么您的行为方式是错误的。如果我的理解是正确的,整个查询将类似于
"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";