2014-01-07 41 views
1

我创建sqlfiddle,试图让我的头围绕这个http://sqlfiddle.com/#!2/21e72/1MAX()函数如预期

在查询不工作,我穿上了compiled_date列max(),但建议仍列通过未来不正确 - 我假设select语句需要插入第3行?

我试过下面的评论者提供的例子,但我想我只是需要从一个基本的查询来理解这一点开始。

+0

您的日期是否使用DATE数据类型存储?此外,考虑提供适当的DDL和/或sqlfiddle与期望的结果集 – Strawberry

+3

这只会产生一个结果,因为mysql对GROUP BY和集合函数的松懈。考虑如果你有另外一列你想获得MAX()的值,而且恰好这个列的MAX值出现在不同的行中,那么这些行的MAX(compiled_date)是发现(或者甚至可能有*多*行具有相同的,最大的,'compiled_date'值)。现在'推荐'有多个*可能的值,mysql只选择一个。 –

+0

是啊日期类型用于编译 – Will

回答

5

正如其他人所指出的那样,问题是,一些列的SELECT既不聚集也不group by子句中使用。大多数数据库管理系统根本不会允许这样做,但MySQL在某些标准上稍微放松了一些......

因此,您需要先为每种情况找到max(compiled_date),然后查找与之相关的建议。

select r.case_number, r.compiled_date, r.recommendation 
from reporting r 
    join (
    SELECT case_number, max(compiled_date) as lastDate 
    from reporting 
    group by case_number 
) s on r.case_number=s.case_number 
     and r.compiled_date=s.lastDate 
+0

我最终得到了我自己我只需要得到一些更多的表格加入和我很好去但谢谢你的确认感觉就像今天敲我的头靠在墙上:) – Will

-1
SELECT 
case.number, 
staff.staff_name AS `case owner`, 
client.client_name, 
case.address, 
(select MAX(compiled_date)from report where case_number=case.number), 
report.recommendation 
FROM 
case 
INNER JOIN report ON report.case_number = case.number 
INNER JOIN client ON case.client_number = client.client_number 
INNER JOIN staff ON case.staff_number = staff.staff_number 
WHERE 
case.active = 1 AND 
staff.staff_name = 'bob' 
GROUP BY 
case.number 
ORDER BY 
case.number ASC 

试试这个

+0

错误 - “字段列表”中的未知列'report.recommendation'(删除report.recommendation行的作品,但只是让我回到我以上使用的原始查询) – Will

+0

现在尝试其工作与否 –

+0

[错误] 1241 - 操作数应包含1列(S)(对不起,如果我是愚蠢的!) – Will

0

检查下面的查询:

SELECT c.number, s.staff_name AS `case owner`, cl.client_name, 
     c.address, MAX(r.compiled_date), r.recommendation 
FROM case c 
INNER JOIN (SELECT r.case_number, r.compiled_date, r.recommendation 
      FROM report r ORDER BY r.case_number, r.compiled_date DESC 
      ) r ON r.case_number = c.number 
INNER JOIN client cl ON c.client_number = cl.client_number 
INNER JOIN staff s ON c.staff_number = s.staff_number 
WHERE c.active = 1 AND s.staff_name = 'bob' 
GROUP BY c.number 
ORDER BY c.number ASC 
3

感谢你们提供了sqlFiddle。但只提供报告数据。我们非常感谢您给我们提供整个表格的样本数据。

无论如何,你可以试试这个吗?

SELECT 
    `case`.number, 
    staff.staff_name AS ``case` owner`, 
    client.client_name, 
    `case`.address, 
    x.mx_date, 
    report.recommendation 
FROM 
    `case` INNER JOIN (
     SELECT case_number, MAX(compiled_date) as mx_date 
     FROM report 
     GROUP BY case_number 
    ) x ON x.case_number = `case`.number 
    INNER JOIN report ON x.case_number = report.case_number AND report.compiled_date = x.mx_date 
    INNER JOIN client ON `case`.client_number = client.client_number 
    INNER JOIN staff ON `case`.staff_number = staff.staff_number 
WHERE 
    `case`.active = 1 
    AND staff.staff_name = 'bob' 
ORDER BY 
    `case`.number ASC;