2012-09-03 66 views
0

我已经按照教程在tizag上为MAX()mysql函数写了下面的查询,这正是我所需要的。唯一的麻烦是我需要将它加入到两个表中,这样我就可以处理所需的所有行。mysql max查询然后JOIN?

$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"); 

有人能告诉我如何合并从我的第二个查询该接合元件上查询?我是PHP和MySQL的新手,这是我第一次读到我已经阅读过的计算机语言,并努力尝试让这两个查询起作用,但我处于一堵砖墙。我不知道如何向JOIN元素添加到第一个查询:(

可能有些善良的人采取一个福利局怜悯和帮助我吗?

回答

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 
+0

谢谢。我认为我有它的工作,非常感谢你!我在哪里可以阅读哪些内容解释你所做的事情? – Dee1983

+0

您已经加入了所有运营商的分配产品。然后,您可以获得每个产品最新日期的所有结果,并将其加入到分配的产品中。 – edze

+0

我必须删除那一点才能使其工作。我非常感谢你! – Dee1983

0

JOIN的功能有些独立于聚合函数,它们只是改变集合函数运行的中间结果集,我喜欢指向MySQL文档的写法,这些提示在SELECT syntax中使用术语“table_reference”,并且扩展了什么这意味着在JOIN syntax。基本上,任何简单的查询有一个表格指定的可以简单地将该表扩展为完整的JOIN子句,并且查询将以相同的基本方式运行,只需修改中间结果集即可。

我说“中间结果集”在这让我明白的连接和聚合的心态暗示。了解MySQL建立最终结果的顺序对于知道如何可靠地获取所需结果至关重要。通常,它首先查看在'FROM'之后指定的第一个表的第一行,并通过查看'WHERE'子句来决定它是否匹配。如果它不是立即可丢弃的,它会尝试将该行加入到指定的第一个JOIN中,并重复“这会被WHERE丢弃吗?”。对于所有JOIN,这些重复都会将行添加到结果集中,或者删除它们,或者只留下一个,以适合您的JOIN,WHERE和数据。这个过程构建了我所说的“中间结果集”。在开始和完成完整查询之间,MySQL在其内存中使用我刚描述的过程构建了一个潜在的巨大表格式数据结构。只有这样,它才会根据您的标准开始汇总(GROUP)结果。

因此,对于你的查询,这取决于具体是什么,你要去的(而不是在OP完全清楚)。如果您只是想从第二查询MAX(日期),你可以简单地认为表达式添加到SELECT子句,然后添加一个聚集规范到最后:

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

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

+1

'GROUP BY'和'SELECT *,MAX(date)'可能不适合初学者。如果使用这个,你应该知道你做了什么。我有时候也会弄脏它,但最好将投影中处理过的所有列分组或使用聚合函数。 – edze

+0

同意,感谢您的评论。我其实很喜欢(在某种程度上),大多数其他RDBMS不允许聚合查询选择没有聚合函数的列。 –

+0

但是对于MySQL来说,即使它很脏,性能有时也会更好;-) – edze