mysql - 将 MAX() 与表 JOIN 结合使用时出现问题

标签 mysql

这是我正在尝试转换的当前查询,它需要一个项目 id,然后接收相应的价格/数量/vendor_id 以及最近的日期和不等于 TRAN 的类型。

 SELECT  cs_po_products.price, cs_po_products.qty, cs_po.vendor_id 
        FROM cs_po_products, cs_po
        WHERE cs_po_products.stock_number = :items_id
        AND cs_po_products.po_number = cs_po.id 
        AND type !='TRAN'
        ORDER BY cs_po.date_ordered DESC
        LIMIT 1

此查询工作正常,但必须执行相当多次,这使得加载页面有点慢。我正在尝试创建一个查询,该查询将获取每个 stock_number 的最新 date_ordered 的行。在寻找答案时,我遇到了很多技术,但最常见的是两个表的 JOIN,并在连接中使用 date_ordered 的 MAX() 。但可惜我似乎无法提出正确的查询。

这是众多尝试之一,但我认为是最接近的一次。

SELECT a.price, a.qty, b.vendor_id, a.stock_number, b.max, b.type
 FROM cs_po_products a
 LEFT JOIN (SELECT MAX(date_ordered)as max,vendor_id,type, date_ordered,id FROM cs_po) b 
 ON b.id = a.po_number 
 WHERE stock_number != '' AND date_ordered IS NOT NULL 
 AND type !='TRAN'
 ORDER BY stock_number, date_ordered DESC

如果有人能指出我正确的方向,请提前致谢

编辑:

提供的所有答案仍然给出不止一行的库存编号,例如:

 price      qty     vendor_id   stock_number    date_ordered
 0.05446    123750  51          00010005.01S    2014-02-24 15:29:00
 0.05446    123750  51          00010005.01S    2014-01-02 14:25:00
 0.05446    123750  51          00010005.01S    2013-11-04 13:48:00
 0.05402    123750  51          00010005.01S    2013-08-20 10:02:00
 0.0532     123750  51          00010005.01S    2013-07-12 09:21:00
 0.0538     123750  51          00010005.01S    2013-04-02 12:15:00
 0.0532     123750  51          00010005.01S    2012-12-27 00:00:00
 0.0555     101750  51          00010005.01S    2012-11-07 10:55:00
 0.555      137500  51          00010005.01S    2012-11-02 09:39:00
 0.0532     137500  51          00010005.01S    2012-11-02 09:37:00
 0.0532     123750  51          00010005.01S    2012-10-03 00:00:00

在这个结果中我想要的唯一一行是最上面的一行,因为它具有最近的日期,但在实际结果中还有更多的 stock_numbers,在其下面我也想要那些相应的最大日期

最佳答案

一个子查询,用于从 cs_po 获取每个 id 的最新 date_ordered,然后将其与 cs_po 连接以从表中获取其他值:-

SELECT  cs_po_products.price, cs_po_products.qty, cs_po.vendor_id 
FROM cs_po_products
INNER JOIN 
(
    SELECT id, MAX(date_ordered) AS date_ordered
    FROM cs_po
    GROUP BY id
) sub0
ON cs_po_products.po_number = sub0.id 
INNER JOIN cs_po
ON sub0.id  = cs_po.id 
AND sub0.date_ordered = cs_po.date_ordered
WHERE type !='TRAN'

编辑。

对您想要得到的内容的最佳猜测。但如果没有表格布局和输入测试数据,这很大程度上只是猜测。

SELECT a.*, b.*
FROM
(
    SELECT a.stock_number, MAX(date_ordered) AS date_ordered
    FROM cs_po_products a
    INNER JOIN cs_po b 
    ON b.id = a.po_number
    GROUP BY a.stock_number
) sub0
INNER JOIN cs_po_products a
ON a.stock_number = sub0.stock_number
INNER JOIN cs_po b 
ON b.id = a.po_number
AND b.date_ordered = sub0.date_ordered
WHERE type !='TRAN'

关于mysql - 将 MAX() 与表 JOIN 结合使用时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24677013/

相关文章:

mysql:比较两个表的结构

c# - 跟踪数据库对所有表的更改

javascript - 动态单选按钮表单 react

mysql - Ruby on Rails 控制台在数据库中移动行

mysql - 插入已插入到另一个表中的值

php - 用于解析输入到数据库中的 CSV 文件的嵌套 php 循环 - SQL 插入语句在任意周期失败

php - UTF-8贯穿始终

php - 没有插入数据,查询执行似乎没有运行

javascript - 您如何处理通过 AJAX 保存与尚未创建的对象相关的属性?

Mysql查询喜欢数字大于x