mysql max查询然后加入?

时间:2012-09-03 19:06:37

标签: mysql join max

我已经在tizag上学习了MAX()mysql函数并编写了下面的查询,这正是我需要的。唯一的麻烦是我需要将它连接到另外两个表,这样我就可以处理我需要的所有行。

    $query = "SELECT idproducts, MAX(date) FROM results GROUP BY idproducts ORDER BY MAX(date) DESC"; 

我在下面有这个查询,它有我需要和工作的JOIN:

       $query =     ("SELECT * 
                    FROM operators
                    JOIN products
                    ON operators.idoperators = products.idoperator JOIN results
                    ON products.idProducts = results.idproducts 
                    ORDER BY drawndate  DESC
                    LIMIT 20");

有人可以告诉我如何将顶部查询与我的第二个查询中的JOIN元素合并吗?我是php和mysql的新手,这是我第一次尝试使用计算机语言,我已经阅读并尝试了很难让这两个查询工作,但我处在一堵砖墙上。我无法弄清楚如何将JOIN元素添加到第一个查询:(

有些善良的人会对新手表示同情并帮助我吗?

2 个答案:

答案 0 :(得分:0)

尝试此查询。

SELECT 
    * 
FROM 
    operators
    JOIN products
        ON operators.idoperators = products.idoperator 
    JOIN 
    (
        SELECT 
            idproducts, 
            MAX(date) 
        FROM results 
        GROUP BY idproducts 
    ) AS t
    ON products.idproducts = t.idproducts
ORDER BY drawndate  DESC
LIMIT 20

答案 1 :(得分:0)

JOINs函数在某种程度上独立于聚合函数,它们只是改变聚合函数运行的中间结果集。我想指出MySQL文档的编写方式,哪些提示在SELECT syntax中使用术语“table_reference”,并扩展了JOIN syntax中的含义。基本上,任何具有指定表的简单查询都可以简单地将该表扩展为完整的JOIN子句,并且查询将以相同的基本方式运行,只需使用修改的中间结果集。

我说“中间结果集”暗示了帮助我理解JOINS和聚合的心态。了解MySQL构建最终结果的顺序对于了解如何可靠地获得所需结果至关重要。通常,它首先查看在“FROM”之后指定的第一个表的第一行,然后通过查看“WHERE”子句来确定它是否匹配。如果它不能立即丢弃,它会尝试将该行连接到指定的第一个JOIN,并重复“它将被WHERE丢弃吗?”。对于所有JOIN重复此操作,这些JOIN可以向结果集添加行,也可以删除它们,或者只保留一个JOIN,以适合您的JOIN,WHERE和数据。当我说“中间结果集”时,这个过程构建了我所指的内容。在开始和完成整个查询之间的某个地方,MySQL在其内存中有一个潜在的大规模表格式数据结构,它是使用我刚才描述的过程构建的。只有这样才能开始根据您的标准聚合(GROUP)结果。

因此,对于您的查询,它取决于您的具体用途(在OP中并不完全清楚)。如果您只想从第二个查询中获取MAX(日期),您只需将该表达式添加到SELECT子句中,然后在末尾添加聚合规范:

SELECT *, MAX(date)
FROM operators
 ...
GROUP BY idproducts
ORDER BY ...

或者,您可以将第二个查询的JOIN部分添加到第一个查询。