mysql:组结果,限制它们并在一个查询中连接到其他表

时间:2012-03-30 11:00:40

标签: php mysql join

我有一个在线申请,我需要一种仪表板(使用白色空间)。

有三个表用于操作:

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

2 个答案:

答案 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";