2009-07-25 225 views
4

我有这个相当复杂的查询来抓取三张表中的数据,现在我希望它变得更加复杂(哦,亲爱的)!SQL查询选择除最大值以外的所有内容

我想最后发布的功能显示在它自己的页面部分,这很容易通过选择表中的最后一项。但是,对于复杂的查询(网站的主页),我希望能够不显示此功能。

我想union以下查询到我以前的查询,但它没有返回正确的结果:

SELECT 
    features.featureTitle AS title, 
    features.featureSummary AS body, 
    features.postedOn AS dummy, 
    DATE_FORMAT(features.postedOn, '%M %d, %Y') AS posted, 
    NULL, 
    NULL, 
    staff.staffName, 
    features.featureID 
FROM 
    features 
    LEFT JOIN staff ON 
     features.staffID = staff.staffID 
WHERE features.postedOn != MAX(features.postedOn) 
ORDER BY dummy DESC LIMIT 0,15 

此查询将返回以下错误:

MySQL error: #1111 - Invalid use of group function

是有没有办法解决这个问题?

+0

为什么使用features.postedOn AS dummy(假设通过命名为dummy,而不是使用它)而不仅仅是ORDER BY features.postedOn? – Stefan 2009-07-25 19:38:24

+0

features.postedOn永远不会在网站上下文中使用*,它总是格式化的字符串'posted'。这是一个虚拟字符串,用于维护各种条目的顺序,因此它的名称为'虚拟'(因为'发布'的顺序会返回无意义的结果)。 – different 2009-08-05 16:18:38

回答

5

max查询需要在自己的子查询中,因此最终SQL应该是::

SELECT features.featureTitle AS title, 
    features.featureSummary AS body, 
    features.postedOn AS dummy, 
    DATE_FORMAT(features.postedOn, '%M %d, %Y') AS posted, 
    NULL, 
    NULL, 
    staff.staffName, 
    features.featureID 
FROM 
    features 
    LEFT JOIN staff ON 
     features.staffID = staff.staffID 
WHERE 
    features.postedOn != (select max(features.postedOn) from features) 
+1

你是明星。谢谢。 :-) – different 2009-07-25 19:20:14

+0

过滤日期字段可能不是一个好主意,因为它不保证是唯一的 - 可能同时有两个帖子。通过id过滤更好。 – Guss 2009-07-25 19:39:57

+0

鉴于我的网站发布精选文章的频率(一周或更少),这将是一个非问题。不管怎么说,还是要谢谢你。 :-) – different 2009-07-25 20:12:25

0

你的是,问题是,你需要找到最大距离(最新)功能表,而遍历每一行,但MAX()是一个组函数 - 你必须将所有行分组来使用它。

你可以使用子查询来获得最后一个特征的ID:

WHERE featureId <> (SELECT featureId From features ORDER BY postedOn DESC LIMIT1) 

有这种方法的一个问题 - 子选择运行的每一行,但它是不贵。