我有两张桌子:画廊和图片:
画廊
id int (auto increment, primary key)
name varchar图片
id int (auto increment, primary key)
picture varchar
gallery_id int (foreign key)如何将左表(库)中的每行显示的这两个表连接到第二个表的第一行,而不遍历第二个表中的所有行?我正在使用MySQL。
我的目标是制作一个包含现有画廊列表的页面,其中显示每个画廊的图片,作为与该画廊所有图片的详细信息页面的链接。
我在这个网站上搜索过这个问题,但是类似的问题太复杂了。我只对这个简单的例子感兴趣。
发布于 2011-06-24 13:24:53
编辑的
显然,在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'发布于 2011-06-27 08:58:56
第二个选项(不进行分组)是使用内部行编号,并将行号限制在第一次出现。
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发布于 2021-04-19 19:22:19
解决方案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,这基本上是通过在join条件中添加子查询来从相关图片中只选择一行(我知道我正在使用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
);https://stackoverflow.com/questions/6468314
复制相似问题