Mysql 从以前查询的结果中提取文章的最新版本

Mysql 从以前查询的结果中提取文章的最新版本,mysql,sql,database,liferay,Mysql,Sql,Database,Liferay,我有以下疑问: SELECT e_c.*, c.name, j.status, j.version, j.articleId, j.title FROM assetcategory AS c INNER JOIN assetentries_assetcategories AS e_c ON c.categoryId = e_c.categoryId AND c.name = 'news' INNER JOIN assetentry AS e ON

我有以下疑问:

SELECT e_c.*, c.name, j.status, j.version, j.articleId, j.title FROM assetcategory AS c
    INNER JOIN assetentries_assetcategories AS e_c 
        ON c.categoryId = e_c.categoryId AND c.name = 'news'
    INNER JOIN assetentry AS e
        ON e.entryId = e_c.entryId
    INNER JOIN journalarticle AS j
        ON j.resourcePrimKey = e.classPK
        AND e.classNameId = (SELECT classNameId FROM classname_ WHERE value = 'com.liferay.portlet.journal.model.JournalArticle')
        AND j.companyId= e.companyId
WHERE j.status = 0

它返回
日志文章
中的所有类别
新闻
。从结果中,我需要为每个
articleId
选择最新版本。例如,假设有一篇文章有4个版本,即使标题不同,也是同一篇文章,因为它将具有相同的
articleId
。因此,对于每个唯一的
articleId
,我需要最新的
版本。如何才能做到这一点?

向子查询添加一个联接,该子查询可查找每篇文章的最新版本:

SELECT e_c.*, c.name, j1.status, j1.version, j1.articleId, j1.title
FROM assetcategory AS c
INNER JOIN assetentries_assetcategories AS e_c 
    ON c.categoryId = e_c.categoryId AND c.name = 'news'
INNER JOIN assetentry AS e
    ON e.entryId = e_c.entryId
INNER JOIN journalarticle AS j1
    ON j1.resourcePrimKey = e.classPK AND
       e.classNameId = (SELECT classNameId FROM classname_
                   WHERE value = 'com.liferay.portlet.journal.model.JournalArticle') AND
       j.companyId = e.companyId
INNER JOIN
(
    SELECT articleId, MAX(version) AS max_version
    FROM journalarticle
    WHERE status = 0
    GROUP BY articleId
) j2
    ON j1.articleId = j2.articleId AND j1.version = j2.max_version;

连接到上面别名为
j2
的子查询背后的基本思想是,它将结果集限制为每篇文章的最新版本。我们不必更改查询的其余部分。

向子查询添加一个连接,该子查询将查找每篇文章的最新版本:

SELECT e_c.*, c.name, j1.status, j1.version, j1.articleId, j1.title
FROM assetcategory AS c
INNER JOIN assetentries_assetcategories AS e_c 
    ON c.categoryId = e_c.categoryId AND c.name = 'news'
INNER JOIN assetentry AS e
    ON e.entryId = e_c.entryId
INNER JOIN journalarticle AS j1
    ON j1.resourcePrimKey = e.classPK AND
       e.classNameId = (SELECT classNameId FROM classname_
                   WHERE value = 'com.liferay.portlet.journal.model.JournalArticle') AND
       j.companyId = e.companyId
INNER JOIN
(
    SELECT articleId, MAX(version) AS max_version
    FROM journalarticle
    WHERE status = 0
    GROUP BY articleId
) j2
    ON j1.articleId = j2.articleId AND j1.version = j2.max_version;

连接到上面别名为
j2
的子查询背后的基本思想是,它将结果集限制为每篇文章的最新版本。我们不必更改查询的其余部分。

伙计,非常感谢你。我花了一整天的时间在这上面,而你只花了5分钟就给了我。我怎样才能成为像你这样的专家呢?忽略你的朋友和家人,而是花时间回答关于堆栈溢出的SQL问题:-。。。顺便说一句,你可以接受这个答案,用左边的绿色勾选标记它是正确的。我只知道最基本的。我理解你作为答案给出的查询,但我想不出来。搜索有关查询的信息以查找每个组的最大值。我的答案就是这个的一个应用。老兄,非常感谢你。我花了一整天的时间在这上面,而你只花了5分钟就给了我。我怎样才能成为像你这样的专家呢?忽略你的朋友和家人,而是花时间回答关于堆栈溢出的SQL问题:-。。。顺便说一句,你可以接受这个答案,用左边的绿色勾选标记它是正确的。我只知道最基本的。我理解你作为答案给出的查询,但我想不出来。搜索有关查询的信息以查找每个组的最大值。我的答案只是这方面的一个应用。通过数据库直接访问Liferay的数据迟早也会导致通过这些方法写入数据的诱惑。这已经被多次证明是造成灾难的原因。请注意,Liferay有一个您应该使用的API,而不是处理数据库本身。它将使您的生活(尤其是升级)变得更加轻松。如果您写入数据库,则所有赌注都将被取消。它可能现在就可以工作,但在将来的升级过程中会失败,因为有些数据是升级例程(或API)不希望看到的(或缺少它希望看到的数据),直接通过数据库访问Liferay的数据迟早也会导致通过这些方法写入数据的诱惑。这已经被多次证明是造成灾难的原因。请注意,Liferay有一个您应该使用的API,而不是处理数据库本身。它将使您的生活(尤其是升级)变得更加轻松。如果您写入数据库,则所有赌注都将被取消。它可能现在就可以工作,但在将来的升级过程中会失败,因为有些数据是升级例程(或API)不希望看到的(或者缺少它希望看到的数据)