0

我正在建立一个类似 Pinterest 风格的网站,处于非常早期的开发阶段。

我可以毫无问题地做到这一点,但我想知道这是否是最好的方法。

客观的:

从数据库中提取所有图像数据,然后,对于每个图像,从“收藏夹”表中提取数据,计算照片的收藏夹,然后,如果存在活动的用户会话,则判断用户是否标记为收藏夹。

问题

该网站默认显示 54 张照片,然后,对于这 54 张照片,程序必须查找每张照片的收藏夹。这代表了对服务器和数据库的许多请求,我认为它的形式是:

$images = 'SELECT * FROM IMAGES photo_id ORDER BY LIMIT 54';

foreach ( $images as $image ) {
   $lookFavorite = 'SELECT * FROM favorites WHERE photo_id ='. $ image ['photo_id'] ';
}

数据库表结构

相片

photo_id    INT (auto increment)
user_nick   VARCHAR (25)
photo_path  VARCHAR (255)
photo_title VARCHAR (150)
photo_theme VARCHAR (60)
date        TIMESTAMP

收藏夹

photo_id  INT
user_nick VARCHAR (25)
date      TIMESTAMP

重要的

PHP version 5.3, using MySQL.
The program I'm building is object oriented [I'm using PDO'].
4

4 回答 4

2

您应该使用从图像到收藏夹的左连接,然后根据需要使用 GROUP BY 来获取计数,以防有图像有 0 个收藏夹。

SELECT * 
FROM `images` 
LEFT JOIN `favorites` ON `images`.`photo_id`=`favotites`.`photo_id`
于 2013-03-11T20:40:49.557 回答
0

放下循环并做

$lookFavorite = 'SELECT * FROM favorites';

创建一个包含所有内容的数组,然后根据您从该数组中获得的内容循环访问您需要的内容

$images = 'SELECT * FROM IMAGES photo_id ORDER BY LIMIT 54';

这样,只运行了两个查询而不是 55

或者

$images = 'SELECT * FROM photos INNER JOIN favorites ON (favorites.photo_id = photos.photo_id) ORDER BY favorites.photo_id LIMIT 54';

在单个查询中完成

于 2013-03-11T20:36:13.917 回答
0

我认为您在这里寻找的是 LEFT JOIN。

SELECT * FROM images
LEFT JOIN favorites
ON images.photo_id = favorites.photo_id
WHERE images.photo_id IN (..array populated from first query..)

如果您需要将结果限制为前 54 个图像,那么您只需使用适当的谓词填充 JOIN 的 WHERE 子句。

作为旁注,我选择 LEFT JOIN 是因为我想在该列表中包含所有图像,即使它们没有收藏夹,但我不想包含与我想要的图像不相关的收藏夹。

于 2013-03-11T20:44:48.327 回答
0

1 如果您不需要所有字段,请不要使用 *。

在你的服务器上测试,但我认为这个解决方案工作得更快

$images = 'SELECT photo_id, photo_path FROM photos LIMIT 54';
$ids = array();
foreach ( $images as $image ) {
  $ids[]= $image ['photo_id'];
}

$lookFavorite = 'SELECT * FROM favorites WHERE photo_id in ('. implode(',',$ids). ')';
于 2013-03-11T20:52:09.960 回答