Mysql加入计算的最大结果

标签 mysql join subquery

我有一个现有的查询:

select ProductLinesID, ProductID, ProductName, ProductCatalog, ManufacturerName,
         productMSDSStatus, productStatusDesc, productStatusIcon, DATE_FORMAT(dateAdded,'%d/%m/%Y') As dateAdded, DATE_FORMAT(ProductRevision,'%d/%m/%Y') as ProductRevision,
         ManufacturerID, SupplierName, ProductID, DATE_FORMAT(dateLatestCheck, '%d/%m/%Y') as dateLatestCheck,s.SupplierID
  from sds_productlines pl
         right join sds_products p on p.ProductID = pl.productlinesProductID
         left join sds_manufacturer m on p.ProductManufacturer = m.ManufacturerID
        left join sds_product_status ps on p.productMSDSStatus = ps.productStatusID
         left join sds_departments d on pl.ProductLinesDepartmentID = d.DepartmentID
         left join sds_hospitals h on h.hospitalID = d.DepartmentHospitalID
         left join sds_supplier s on s.SupplierID = pl.SupplierID

在 php 页面中定义。我被要求添加另一个存储在另一个表中的参数,问题是,在 sds_product 上可以有很多“通信”,这基本上就像一个带有 date_created 的评论。例如,如果我想要一个给定产品的通讯列表,我会这样做:

select  * from sds_product_comms as pc
join sds_comms c on pc.comms_id = c.comms_id
where prod_id = 2546

我想直接在 SQL 中执行此操作,因此是否有可能以某种方式进行子查询以将这两个查询结合在一起,而无需在初始查询中创建重复的行。

例如,我不希望同一产品的 5 行具有相同的最大创建日期。

desc sds_comms

'comms_id', 'int(10) unsigned', 'NO', 'PRI', '', 'auto_increment'
'method', 'int(10) unsigned', 'NO', '', '', ''
'dialogue', 'varchar(200)', 'NO', '', '', ''
'reply_id', 'int(10) unsigned', 'NO', '', '', ''
'comm_to', 'varchar(60)', 'NO', '', '', ''
'comm_from', 'varchar(60)', 'NO', '', '', ''
'man_id', 'int(10) unsigned', 'NO', '', '', ''
'supp_id', 'int(10) unsigned', 'NO', '', '', ''
'user_id', 'int(10) unsigned', 'NO', '', '', ''
'date_created', 'timestamp', 'NO', '', 'CURRENT_TIMESTAMP', ''

很抱歉说得太详细了,但我很难理解它!

编辑:

select ProductLinesID, ProductID, ProductName, ProductCatalog, ManufacturerName,
         productMSDSStatus, productStatusDesc, productStatusIcon, DATE_FORMAT(dateAdded,'%d/%m/%Y') As dateAdded, DATE_FORMAT(ProductRevision,'%d/%m/%Y') as ProductRevision,
         ManufacturerID, SupplierName, ProductID, DATE_FORMAT(dateLatestCheck, '%d/%m/%Y') as dateLatestCheck,s.SupplierID
         ,lastContact
  from sds_productlines pl
         right join sds_products p on p.ProductID = pl.productlinesProductID
         left join sds_manufacturer m on p.ProductManufacturer = m.ManufacturerID
        left join sds_product_status ps on p.productMSDSStatus = ps.productStatusID
         left join sds_departments d on pl.ProductLinesDepartmentID = d.DepartmentID
         left join sds_hospitals h on h.hospitalID = d.DepartmentHospitalID
         left join sds_supplier s on s.SupplierID = pl.SupplierID
         left join sds_product_comms pc on pc.prod_id = p.productID
         left join (select comms_id, max(date_created) as lastContact from sds_comms group by comms_id ) as c2 on pc.comms_id = c2.comms_id
where productID=555;

这是正确的做法吗?使用这种方法,我为相同的 productID 获得了不同的 lastContact 日期 :(

最佳答案

试试这个:

select ProductLinesID, ProductID, ProductName, ProductCatalog, ManufacturerName,
         productMSDSStatus, productStatusDesc, productStatusIcon, DATE_FORMAT(dateAdded,'%d/%m/%Y') As dateAdded, DATE_FORMAT(ProductRevision,'%d/%m/%Y') as ProductRevision,
         ManufacturerID, SupplierName, ProductID, DATE_FORMAT(dateLatestCheck, '%d/%m/%Y') as dateLatestCheck,s.SupplierID,
         c.date_created as lastContact
  from sds_productlines pl
         right join sds_products p on p.ProductID = pl.productlinesProductID
         left join sds_manufacturer m on p.ProductManufacturer = m.ManufacturerID
        left join sds_product_status ps on p.productMSDSStatus = ps.productStatusID
         left join sds_departments d on pl.ProductLinesDepartmentID = d.DepartmentID
         left join sds_hospitals h on h.hospitalID = d.DepartmentHospitalID
         left join sds_supplier s on s.SupplierID = pl.SupplierID
         left join sds_product_comms pc on pc.prod_id = p.productID
         left join comms_id c on c.comms_id = pc.comms_id and c.date_created = (select max(date_created) from comms_id c2 where c2.comms_id = pc.comms_id)
where productID=555;

关于Mysql加入计算的最大结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5223315/

相关文章:

mysql - 使用不同行中的值对同一个表进行查询

python - mysql 子查询和 python 集

Mysql 查询具有多个子查询,并按不同条件进行分组

mysql - 如何在子查询或分组依据上获取多列

java - MyBatis 中单个映射器方法中的多个语句

php - Mysql数据库未插入值

mysql - 选择有限制的平均值

MySQL 使用 UNION 连接 3 个表

php - JOIN 中的 SQL JOIN

c# - 简单的连接消耗太多内存 - LINQ