Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从相册和相册详细信息中选择第一行_Php_Mysql - Fatal编程技术网

Php 如何从相册和相册详细信息中选择第一行

Php 如何从相册和相册详细信息中选择第一行,php,mysql,Php,Mysql,我目前正在为一个网站开发一个相册页面,我的想法是创建一个所有相册的概览,显示最近添加的5张图片。photoalbum使用两个MySQL表,一个包含相册详细信息,例如:相册名称、相册id,另一个包含图片,我将它们与相应的相册id一起作为blob存储到数据库中 然而,我至今还无法找到一个查询,该查询允许我获取相册的所有详细信息以及相册对应的5张最新图片的id。我希望你能帮我一点忙 这些表如下所示: SELECT a.*, p.* FROM photoalbums AS a LEFT JOIN pic

我目前正在为一个网站开发一个相册页面,我的想法是创建一个所有相册的概览,显示最近添加的5张图片。photoalbum使用两个MySQL表,一个包含相册详细信息,例如:相册名称、相册id,另一个包含图片,我将它们与相应的相册id一起作为blob存储到数据库中

然而,我至今还无法找到一个查询,该查询允许我获取相册的所有详细信息以及相册对应的5张最新图片的id。我希望你能帮我一点忙

这些表如下所示:

SELECT a.*, p.*
FROM photoalbums AS a
LEFT JOIN pictures AS p ON a.id = p.album_id
WHERE a.id = 1  -- (insert number here)
ORDER BY p.modified_date
LIMIT 5
表:相册

id | album_name | album_created
-------------------------------------
1  | testalbum  | 2010-11-07 19:33:20
2  | some more  | 2010-11-15 18:48:29
表:图片

id | file   | thumbnail | name  | album_id
------------------------------------------
1  | binary | binary    | test1 | 1
2  | binary | binary    | test2 | 1
3  | binary | binary    | test3 | 2
4  | binary | binary    | test4 | 2
5  | binary | binary    | test5 | 1
在我看来,我需要一个子查询,或者对每个相册执行单独的查询。我宁愿避免使用多个查询

有人能帮我找到正确的方法吗?提前谢谢。

试试看

SELECT * FROM pictures LEFT JOIN photoalbums ON (photoalbums.id=pictures.id) ORDER BY album_created DESC
 LIMIT 5

您可能想考虑创建一个单独的、非规范化的“历史”表,该表插入到任何新照片插入的同时,包含相册ID、照片插入的日期,以及您希望在该历史表中显示结果的任何列。然后,您可以根据照片创建日期从这个表中选择。我认为相册创建日期在这里对您没有帮助

这样做的另一个好处是将基于照片创建日期运行的任何查询与对照片和相册执行的其他插入/更新/读取操作(与照片创建日期无关)分开。例如,在相册和图片表上为您保存一个额外索引


这确实会增加存储和插入操作的成本,但会提高读取速度。您还必须小心维护历史记录表。删除/更新/插入照片表和相册表也需要更新历史记录表。

如果只是一个特定相册的信息,并且如果在图片表中添加日期修改列,则可以执行以下操作:

SELECT a.*, p.*
FROM photoalbums AS a
LEFT JOIN pictures AS p ON a.id = p.album_id
WHERE a.id = 1  -- (insert number here)
ORDER BY p.modified_date
LIMIT 5

对于所有相册的5个最新图片修改的列表,那么是的,有一些方法可以创建一个查询来返回该信息。让我知道,我也会为您做一个类似的查询。

虽然我认为您可以使用游标q.v.或临时或甚至永久(如梅西建议的表)来完成所要求的操作,但您必须问问自己,如果您真的有充分的理由达到这些长度,那么四行或五行PHP将满足您的要求,以多个更小、更简单的查询为代价


你应该记住这个吻,并在心中保持它的神圣

此查询将获取所有相册详细信息和所有图片,这些图片按ID降序,以逗号分隔。我只能假设最高的picture.id是最近的,因为您没有为图片插入日期列

SELECT a.*, GROUP_CONCAT(p.id ORDER BY p.id DESC) as picID FROM photoalbums AS a INNER JOIN pictures AS p ON p.album_id=a.id GROUP BY p.album_id
正如我所说,这将以递减的ID顺序获取所有图片。使用php,只需分解逗号并切掉前5个ID即可


我必须感谢您提供了这个有趣的小项目,但我必须继续前进,不幸的是,仅仅使用sql查询并没有准确地得到您想要的结果。

要在一个过程中完成此操作,您需要在查询运行时以某种方式与父字段关联。为此,您需要使用一个变量。在这里,我使用变量x在查询运行时保存当前计数。选中每个记录后,它将决定当前是否处理属于当前父项的记录。如果是这样的话,它只会给运行总数增加0.5。我最初尝试了1,但似乎添加了两次1

这是最后一个查询。如果有帮助,请告诉我-

挑选 相册编号:, 身份证件 @x:=if@album_id=相册id,@x+0.5,1 cnt, @相册\u id:=相册\u id 从…起 图片 分组 相册_id,id,cnt 有
cnt这不会返回每个相册的5张最新图片,只返回相册Creation订购的5张最新图片,但图片没有日期!您是否经常需要所有相册的列表,以及它们各自的5张最新图片中的每一张?似乎更多的时候,你只想为某张专辑拍5张最新的照片。我在想一张临时的桌子。或者子查询欺骗中的限制。然而,我们同意——只要在php中使用一个循环,每个相册重复限制5次查询,就可以了。