首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中连接两个表,只从第二个表返回一行

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

Stack Overflow用户
提问于 2011-06-24 13:15:18
回答 3查看 18.7K关注 0票数 9

我有两张桌子:画廊和图片:

画廊

代码语言:javascript
复制
id           int (auto increment, primary key)
name         varchar

图片

代码语言:javascript
复制
id           int (auto increment, primary key)
picture      varchar
gallery_id   int (foreign key)

如何将左表(库)中的每行显示的这两个表连接到第二个表的第一行,而不遍历第二个表中的所有行?我正在使用MySQL。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-24 13:24:53

编辑的

显然,在MySQL数据库中进行分组会为您带来好处。

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

代码语言:javascript
复制
SELECT *
FROM tblmain
  inner join sub on sub.sub_main_id = main_id
group by main_id;

没有小组,我有以下记录:

代码语言:javascript
复制
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'

分组后,我得到以下结果:

代码语言:javascript
复制
1, 1, 1, 'test 1'
2, 3, 2, 'test 3'
3, 4, 3, 'test 4'
票数 13
EN

Stack Overflow用户

发布于 2011-06-27 08:58:56

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

​

代码语言:javascript
复制
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;

Hope this helps for you
票数 0
EN

Stack Overflow用户

发布于 2021-04-19 19:22:19

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

代码语言:javascript
复制
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,这基本上是通过在join条件中添加子查询来从相关图片中只选择一行(我知道我正在使用PostgreSQL,但我相信它仍然适用于MySQL,或者只是忽略了这一点,只使用该技术):

代码语言:javascript
复制
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
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6468314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档