首页 > 解决方案 > MySQL 主表的所有结果和左连接的一些结果

问题描述

我有两张桌子。一个带有与文章编号相关的图像。还有一张照片上有货号的

我想要做的是列出第一个表中的所有图像(navn),它是一个特定的文章编号(art_id)和第二个表中的最多 5 个图像,其中文章编号(artid)出现在照片(fotostation)上。

我现在无法解决如何做到这一点:)

这不起作用

SELECT i.* FROM ecs_article_images AS i 
LEFT JOIN 
( SELECT * FROM ecs_article_images_inneholder WHERE art_id = i.art_id LIMIT 0,5 ORDER BY dato DESC) AS inn ON inn.fotostation=i.fotostation                          
 WHERE i.art_id='MS174868' ORDER BY  nr, id DESC

表:

CREATE TABLE `ecs_article_images` (
 `id` int(11) NOT NULL,
 `navn` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `nr` int(11) NOT NULL,
 `art_id` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
 `type` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
 `fotostation` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `dato` datetime NOT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `ecs_article_images_inneholder` (
 `id` int(11) NOT NULL,
 `fotostation` varchar(150) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `artid` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `dato` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这些表与 fotostation 字段相关。要在“ecs_article_images_inneholder”中查找具有artid 的文件的名称,我必须在“ecs_article_images”中查找具有相同fotostation 的navn。

标签: mysqlsql

解决方案


您可以使用row_number()来枚举行。我不确定这两个表是如何相关的。以下假设它在文章和照片站上:

SELECT i.*
FROM ecs_article_images i LEFT JOIN 
     (SELECT inn.*,
             ROW_NUMBER() OVER (PARTITION BY inn.art_id, inn.fotostation ORDER BY dato DESC) as seqnum
      FROM ecs_article_images_inneholder inn
      WHERE  LIMIT 0,5 ORDER BY dato DESC) AS inn ON  
     ) inn
     ON inn.art_id = i.art_id AND
        inn.fotostation = i.fotostation AND
        inn.seqnum <= 5                      
 WHERE i.art_id = 'MS174868'
 ORDER BY  nr, id DESC;

关键是PARTITION BY键需要与JOIN键匹配。


推荐阅读