2017-10-10 292 views
0

早在1月份,我收到了一些关于将多个数据库查询合并为一个“兆”查询的非常有用的信息,它可以找到HERE在一个子查询中从同一表的两列中选择记录

我已经扩展了其中一个子查询,这个从photos表中选择一张随机的照片,用于显示页面上显示的每个项目。对于初学者来说,这里是从原来的职位HERE表:

+----------+------------+--------+ 
| photo_id | project_id | active | 
|--------------------------------| 
|  1 |  1  | 1 | 
|  2 |  1  | 1 | 
|  3 |  1  | 1 | 
|  4 |  2  | 1 | 
|  5 |  2  | 1 | 
|  6 |  2  | 1 | 
|  7 |  3  | 1 | 
|  8 |  3  | 1 | 
|  9 |  3  | 1 | 
+----------+------------+--------+ 

这是提到HERE

(SELECT photo_id FROM Photos 
    where project_id = p.project_id ORDER BY RAND LIMIT 1) as random_photo, 

我已经添加了额外的列,文件名,画廊数量在后推荐给我的子查询每个图像与哪个图像相关联,每个图像的宽度和每个图像的高度。

+----------+------------+----------+--------+---------+-------+--------+ 
| photo_id | filename project_id | active | gallery | width | height | 
|----------------------------------------------------------------------| 
|  1 | pic1.jpg | 1  | 1 | 1  | 600 | 400 | 
|  2 | pic2.jpg | 1  | 1 | 1  | 600 | 400 | 
|  3 | pic3.jpg | 1  | 1 | 1  | 400 | 600 | 
|  4 | pic4.jpg | 2  | 1 | 2  | 600 | 400 | 
|  5 | pic5.jpg | 2  | 1 | 2  | 600 | 400 | 
|  6 | pic6.jpg | 2  | 1 | 2  | 600 | 400 | 
|  7 | pic7.jpg | 3  | 1 | 3  | 400 | 600 | 
|  8 | pic8.jpg | 3  | 1 | 3  | 400 | 600 | 
|  9 | pic9.jpg | 3  | 1 | 3  | 400 | 600 | 
+----------+------------+----------+--------+---------+-------+--------+ 

我更新了查询只选择图像的宽度是大于高度,从而只能选择一个风景图片:

(SELECT filename FROM photos 
WHERE project_id = p.project_id AND width > height ORDER BY RAND() LIMIT 1) as random_photo, 

而这种工作方式所需。

我的新障碍是想选择随机图像的文件名和关联的图库编号,这是我卡住的地方。在我的原始文章(HERE)中,有另一个子查询从另一个表格中选择一个标签列表,它使用SELECT GROUP_CONCAT,所以我尝试了许多方法,但这显然是一个我正在研究的领域。

我也使用random_photo第二子查询这样的内尝试:

(SELECT gallery FROM photos 
    WHERE filename = random_photo) as gallery_number, 

,并没有奏效。理想情况下,我想一次性检索随机照片文件名及其关联的图库编号。我很抱歉,如果我在这里丢失了一些明显的东西,并且预先感谢您的帮助。

回答

1

简单而有点尴尬的解决办法是:

(SELECT Concat(gallery,'___',filename) FROM photos 
WHERE project_id = p.project_id AND width > height ORDER BY RAND() LIMIT 1) as random_photo 

如果使用上述解决方案,你需要的结果在“___”在你的PHP代码中第一次出现分裂。

更复杂的解决方案是选择一个随机ID并将结果加入到照片表中,但它取决于您的“超级查询”的其他部分如何执行此操作。

+0

谢谢你。有几个问题:具体是什么“___”在做,这相当于','吗?此外,在你看来,是什么让这个尴尬的解决方案?至于你对复杂解决方案的建议,我同意。 – mileaminute

+0

___只是一个分隔符,所以你可以拆分2列,这两列在你的php代码中合并成一个。您在图库2中的图片pic001.jpg的结果将为'2 ___ pic001.jpg',全部在一列中。这也是它的尴尬,它需要一些胶水代码。如果您不小心并且文件名包含'___',它也可能会导致其他问题。如果你只是在第一次出现时分裂,这不应该引起问题,你甚至可以使用更短的分隔符,如' - ',但你需要知道它。它适用于所有文件名,因为int gallerynumber放在文件名之前。 – Compufreak

+0

很好的解释,谢谢。我在我的php代码中爆炸了绑定变量,并能够根据需要输出数据。非常感谢! – mileaminute

相关问题