在一个子查询中从同一表的两列中选择记录
问题描述:
早在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,
,并没有奏效。理想情况下,我想一次性检索随机照片文件名及其关联的图库编号。我很抱歉,如果我在这里丢失了一些明显的东西,并且预先感谢您的帮助。
答
简单而有点尴尬的解决办法是:
(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并将结果加入到照片表中,但它取决于您的“超级查询”的其他部分如何执行此操作。
谢谢你。有几个问题:具体是什么“___”在做,这相当于','吗?此外,在你看来,是什么让这个尴尬的解决方案?至于你对复杂解决方案的建议,我同意。 – mileaminute
___只是一个分隔符,所以你可以拆分2列,这两列在你的php代码中合并成一个。您在图库2中的图片pic001.jpg的结果将为'2 ___ pic001.jpg',全部在一列中。这也是它的尴尬,它需要一些胶水代码。如果您不小心并且文件名包含'___',它也可能会导致其他问题。如果你只是在第一次出现时分裂,这不应该引起问题,你甚至可以使用更短的分隔符,如' - ',但你需要知道它。它适用于所有文件名,因为int gallerynumber放在文件名之前。 – Compufreak
很好的解释,谢谢。我在我的php代码中爆炸了绑定变量,并能够根据需要输出数据。非常感谢! – mileaminute