0

我已经按照 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 元素添加到第一个查询:(

有好心人能同情一个新手并帮助我吗?

4

2 回答 2

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
于 2012-09-03T19:19:03.077 回答
0

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

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

因此,对于您的查询,这取决于您的具体目标(在 OP 中并不完全清楚)。如果您只是想要第二个查询中的 MAX(date),您可以简单地将该表达式添加到 SELECT 子句,然后在末尾添加一个聚合规范:

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

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

于 2012-09-03T19:20:01.220 回答