Mysql 在groupby之前查询不工作是否需要orderby?

Mysql 在groupby之前查询不工作是否需要orderby?,mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,这应该是一个主题列表,其中有新的附件 此查询中的分组依据无法正常工作。(是的。) 它应该从每个最近有附件的线程中提取一个具有代表性的附件——不仅是新线程,还有任何线程。结果将是一个缩略图链接到相应新图像发布的线程 相反,它不起作用。它目前有两个问题。第一个问题是,它显示线程中的第一个附件,而不是最近的附件。第二个问题是,它按线程创建日期排序。我希望附件创建日期是顺序,线程列表是根据其中包含最新附件的线程排序的。因此,旧线程即使有最近的附件,也不会上升到顶部。我需要先选择一个子项来订购吗?我怎样才

这应该是一个主题列表,其中有新的附件

此查询中的
分组依据
无法正常工作。(是的。) 它应该从每个最近有附件的线程中提取一个具有代表性的附件——不仅是新线程,还有任何线程。结果将是一个缩略图链接到相应新图像发布的线程

相反,它不起作用。它目前有两个问题。第一个问题是,它显示线程中的第一个附件,而不是最近的附件。第二个问题是,它按线程创建日期排序。我希望附件创建日期是顺序,线程列表是根据其中包含最新附件的线程排序的。因此,旧线程即使有最近的附件,也不会上升到顶部。我需要先选择一个子项来订购吗?我怎样才能做到这一点

事先非常感谢你

SELECT *
FROM smf_attachments AS att
    INNER JOIN smf_messages AS m ON (m.id_msg = att.id_msg)
    INNER JOIN smf_topics AS t ON (t.id_topic = m.id_topic)
    LEFT JOIN smf_members AS mem ON (mem.id_member = m.id_member)
    LEFT JOIN smf_attachments AS thumb ON (thumb.id_attach = att.id_thumb)
WHERE att.attachment_type = 0
    AND t.id_board = 3

GROUP BY t.id_topic         
ORDER BY att.id_attach  DESC
LIMIT 2
(编辑)

假设我们有三个主题id,每个主题id有5个附件。附件号越高,表示附件越新;主题id越高,表示主题越新

topic_id 1|attachment 3,6,13,14,15
topic_id 2|attachment 1,2,4,5,12
topic_id 3|attachment 7,8,9,10,11
在上述情况下,查询应提取2条记录(限制2):

因为我只希望每个主题有一个附件,所以有最新附件的两个主题是主题1和主题2(分别有附件15和附件12)。尽管主题3是最近的,但在本例中它不会是一个结果,因为它的附件较旧

(编辑)

我尝试了systemmatrix提供的解决方案,但它仍然按主题id创建日期排序,而不是按包含最新附件的主题排序。我试图把上面的问题说得更清楚。有什么帮助吗?先谢谢你

SELECT *
FROM smf_attachments AS att
    INNER JOIN smf_messages AS m ON (m.id_msg = att.id_msg)
    INNER JOIN smf_topics AS t ON (t.id_topic = m.id_topic)
    LEFT JOIN smf_members AS mem ON (mem.id_member = m.id_member)
    LEFT JOIN smf_attachments AS thumb ON (thumb.id_attach = att.id_thumb)
WHERE att.attachment_type = 0
    AND t.id_board = 3

GROUP BY t.id_topic         
ORDER BY att.id_attach  DESC
LIMIT 2
(编辑) 我现在看到它是按每个主题中第一个附件的日期排序的。主题由最新的第一个附件。我需要与最近的附件或最后的附件主题

编辑 我做了一个改变,给了我正确的主题列表。这是新代码

            SELECT att.id_thumb, att.id_msg, att.attachment_type, att.id_attach, distinct on (t.id_topic)
            FROM smf_attachments AS att
                INNER JOIN smf_messages AS m ON (m.id_msg = att.id_msg)
                INNER JOIN smf_topics AS t ON (t.id_topic = m.id_topic)
                LEFT JOIN smf_members AS mem ON (mem.id_member = m.id_member)
                LEFT JOIN smf_attachments AS thumb ON (thumb.id_attach = att.id_thumb)
            WHERE att.attachment_type = 0
                AND t.id_board = 3


            ORDER BY max(att.id_attach)  DESC
            LIMIT 2
现在唯一的问题是如何让它显示正确的缩略图附件?它仍然显示各自主题中的第一个附件,而不是最后一个附件。有什么帮助吗?
提前感谢。

如果这是每个主题仅需要的3列最新记录

SELECT *
FROM smf_attachments AS att
    INNER JOIN smf_messages AS m ON (m.id_msg = att.id_msg)
    INNER JOIN smf_topics AS t ON (t.id_topic = m.id_topic)
    LEFT JOIN smf_members AS mem ON (mem.id_member = m.id_member)
    LEFT JOIN smf_attachments AS thumb ON (thumb.id_attach = att.id_thumb)
WHERE att.attachment_type = 0
    AND t.id_board = 3

GROUP BY t.id_topic         
ORDER BY att.id_attach  DESC
LIMIT 2
  • 收件人:拇指
  • 附件id\U msg
  • 附件类型
您可以使用在like的结果上使用的技巧来获取由
id\u attach
排序的主题的最新
id\u thumb
,您可以将
id\u thumb
的表达式编写为

SUBSTRING_INDEX(
GROUP_CONCAT(att.id_thumb ORDER BY att.id_attach DESC SEPARATOR '||'),
'||',1) AS id_thumb 

  • 集团公司(出口)
这将为一个主题对所有
id\u thumb
s进行分组,并为您提供 列表以双精度| |分隔,也可以根据更改分隔符 您在上面的需求我已经使用了|作为上面的结果 函数将类似于
thumb1 | | thumb2 | | thumb3 | | thumb4
这将是 按
id\u附件
降序排列

注意结果被截断为group_concat_max_len系统变量给定的最大长度,该系统变量具有默认值 1024个。该值可以设置得更高,但有效最大值 返回值的长度受 允许的最大数据包数


  • 子字符串索引(str、delim、count)
From docs返回计数前字符串str中的子字符串 分隔符delim的出现。如果计数为正,则所有 最后一个分隔符(从左边开始计数)的左边是 返回。如果计数为负数,则一切都在决赛的右边 返回分隔符(从右侧开始计数)。子字符串_索引() 搜索delim时执行区分大小写的匹配


现在,您的最终查询如下所示

SELECT 
SUBSTRING_INDEX(GROUP_CONCAT(att.id_thumb ORDER BY att.id_attach DESC SEPARATOR '||'),'||',1) AS id_thumb,
SUBSTRING_INDEX(GROUP_CONCAT(att.id_msg ORDER BY att.id_attach DESC SEPARATOR '||'),'||',1) AS id_msg,
SUBSTRING_INDEX(GROUP_CONCAT(att.attachment_type ORDER BY att.id_attach DESC SEPARATOR '||'),'||',1) AS attachment_type,
MAX(att.id_attach) AS id_attach_max,
t.id_topic
FROM
  smf_attachments AS att 
  INNER JOIN smf_messages AS m ON (m.id_msg = att.id_msg) 
  INNER JOIN smf_topics AS t ON (t.id_topic = m.id_topic) 
  LEFT JOIN smf_members AS mem ON (mem.id_member = m.id_member) 
  LEFT JOIN smf_attachments AS thumb ON (thumb.id_attach = att.id_thumb) 
WHERE att.attachment_type = 0 
  AND t.id_board = 3 
GROUP BY  t.id_topic
ORDER BY id_attach_max DESC 
LIMIT 2 

使用mysql或sql?嘿,Johnson Jason,我已经介绍了一个,很长的一段时间,用我的编辑猜测(SMF是简单的论坛机器),你能验证一下(或者看看我对你的帖子做了什么)?请根据需要自由编辑/回滚。无论如何,这似乎是一个典型的每组最大N的问题,我已经添加了相应的标签来对您的问题进行分类。你可以看看,你可能会在其中的一些中找到你的解决方案。是的,这是MySQL标签下最常见的问题,但是如果你想要一个特定于你需要的答案,请提供适当的DDL和所需的结果。有人能帮我找到我问题的具体答案吗?谢谢Hiral编辑我的帖子。现在看起来好多了。仍然需要帮助。