繁体   English   中英

在 MySQL 中连接两个表,从第二个表中只返回一行

[英]Join two tables in MySQL, returning just one row from the second table

我有两个表:画廊和图片:

画廊

id           int (auto increment, primary key)
name         varchar

图片

id           int (auto increment, primary key)
picture      varchar
gallery_id   int (foreign key)

我如何加入这两个表,显示左表(图库)中的每一行,只显示第二个表的第一行,而不查看第二个表中的所有行? 我正在使用 MySQL。

我的目标是制作一个包含现有画廊列表的页面,显示每个画廊的图片,作为指向包含该画廊所有图片的详细信息页面的链接。


我在这个网站上搜索过这个问题,但类似的问题太复杂了。 我只对这个简单的例子感兴趣。

已编辑

显然,在 MySQL 数据库中分组可以为您解决问题。

数据库列有main_id, sub_id, sub_main_id, sub_data

SELECT *
FROM tblmain
  inner join sub on sub.sub_main_id = main_id
group by main_id;

没有组我有这些记录:

1, 1, 1, 'test 1'
1, 2, 1, 'test 2'
2, 3, 2, 'test 3'
3, 4, 3, 'test 4'
2, 5, 2, 'test 5'

分组后,我得到这个结果:

1, 1, 1, 'test 1'
2, 3, 2, 'test 3'
3, 4, 3, 'test 4'

第二个选项(不分组)是使用内部行编号,并将行号限制为第一次出现。

set @gallery_id = '';
set @num  = 1;

SELECT * FROM gallery INNER JOIN ( select id, picture, gallery_id from ( select id, picture, gallery_id, @num := if(@gallery_id = gallery_id, @num + 1, 1) as row_number, @gallery_id := gallery_id as dummy from pictures ) as pictureRows where pictureRows.row_number = 1 ) as firstPicture ON firstPicture.gallery_id = gallery.id;

希望这对你有帮助

解决方案 1我使用的方法是使用ROW_NUMBER()函数将行号添加到子集结果(在我们的例子中为图片查询)中,然后在我添加的连接条件中(rn = 1)......它会像下列:

SELECT g.* FROM gallery g 
LEFT JOIN (
    SELECT *, ROW_NUMBER() OVER (ORDER BY id) rn FROM pictures
) p ON g.id = p.gallery_id AND p.rn = 1;

编辑:我没有注意到这是针对 MySQL 我的答案是针对 PostgreSQL,但我相信如果您知道如何将行号添加到查询中,该技术仍然有效。

解决方案2:这是您可以使用的另一种技术,无需添加分组的row_number,这基本上是通过在连接条件中添加子查询以仅从相关图片中选择一行(我知道我还在使用PostgreSQL,但我相信它仍然适用于 MySQL,或者只是忽略它并仅使用该技术):

SELECT g.* FROM gallery g 
LEFT JOIN pictures p ON g.id = p.gallery_id AND p.id = (
    SELECT id FROM pictures WHERE gallery_id = g.id LIMIT 1
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM