从一个子查询中的同一个表的两列中选择记录

时间:2017-10-10 19:49:33

标签: php mysql

早在1月份,我收到了一些非常有用的信息,有关将多个数据库查询合并到一个“mega”查询中,可以找到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 个答案:

答案 0 :(得分: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而不是将结果加入到照片表中,但这取决于“大型查询”的其他部分如何执行此操作。