Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.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_Sql - Fatal编程技术网

Php 为每个相册获取一张图片

Php 为每个相册获取一张图片,php,mysql,sql,Php,Mysql,Sql,我有两张用于画廊系统的桌子: gallery_cat( gallery_cat_id PK, gallery_cat_name ) gallery( gallery_id PK, gallery_cat_id FK, gallery_name, gallery_file_name, gallery_date ) 我需要编写一个SQL查询,从gallery表中为每个相册返回一张图片,目的是我需要为每个相册列出一张图片 gallery_nam

我有两张用于画廊系统的桌子:

gallery_cat(
  gallery_cat_id    PK,
  gallery_cat_name
)

gallery(
  gallery_id        PK,
  gallery_cat_id    FK,
  gallery_name,
  gallery_file_name,
  gallery_date
)
我需要编写一个SQL查询,从gallery表中为每个相册返回一张图片,目的是我需要为每个相册列出一张图片

gallery_name | gallery_cat_name| gallery_file_name
-------------+-----------------+------------------
pic1         | Album1          | pic1.jpg 

这应该可以做到:

SELECT g2.gallery_name, gc2.gallery_cat_name, g2.gallery_file_name
FROM gallery g2
INNER JOIN gallery_cat gc2 ON (g2.gallery_cat_id = gc2.gallery_cat_id)
WHERE g2.gallery_id IN (
  SELECT g.gallery_id     
  FROM gallery g
  GROUP BY g.gallery_cat_id)
说明:

最后是一个子选择

IN (
  SELECT g.gallery_id     
  FROM gallery g
  GROUP BY g.gallery_cat_id) <<-- select 1 random g.id per gallery_cat.  
因为我在同一个查询中引用了同一个表两次,所以您必须使用别名(*)。
我选择所有名称、所有CATName和所有文件名。
但是,在
where
子句中,我过滤这些内容,以便只显示子选择中的行

我必须这样做,因为group by将行混合成一个混乱的ow,如果我直接从中选择,我将从不同的行中混合得到值,这不是一件好事。
通过首先选择我想要的id,然后将整行与这些id匹配,我可以防止这种情况发生


*(在这种情况下,这种子选择并不是100%正确,但请相信我,为表别名总是一个好主意)

您可以使用,否则,您将不得不循环出所有相册,并从每个相册中随机选取一张图片,这将降低效率。

这将尝试为每个类别ID选择最新的
画廊日期
,并根据
画廊类别

SELECT 
  c.gallery_cat_id, 
  c.gallery_cat_name, 
  i.lastimg
FROM
  gallery_cat c 
  LEFT JOIN (
   SELECT gallery_cat_id, gallery_filename AS lastimg, MAX(gallery_date)
   FROM gallery 
   GROUP BY gallery_cat_id, gallery_filename 
  ) i ON c.gallery_cat_id = i.gallery_cat_id

@shox使其成为
左连接
。以上编辑。
SELECT 
  c.gallery_cat_id, 
  c.gallery_cat_name, 
  i.lastimg
FROM
  gallery_cat c 
  LEFT JOIN (
   SELECT gallery_cat_id, gallery_filename AS lastimg, MAX(gallery_date)
   FROM gallery 
   GROUP BY gallery_cat_id, gallery_filename 
  ) i ON c.gallery_cat_id = i.gallery_cat_id