我有两张桌子:画廊和图片:
库
id int (auto increment, primary key)
name varchar
图片
id int (auto increment, primary key)
picture varchar
gallery_id int (foreign key)
如何连接这两个表,显示左表(图库)中每一行只是第二个表的第一行,而没有遍历第二个表中的所有行?我正在使用MySQL。
我的目标是制作一个页面,其中包含显示每个图库图片的现有图库列表,作为指向详细信息页面的链接以及该图库的所有图片。
我在这个网站上搜索过这个问题,但类似的问题太复杂了。我只对这个简单的例子感兴趣。
答案 0 :(得分:12)
<强> EDITED 强>
显然,在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'
答案 1 :(得分:0)
第二个选项(没有分组)是使用内部行编号,并将行号限制为第一次出现。
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;
希望这会对你有所帮助
答案 2 :(得分:0)
解决方案 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
);