Mysql join на рассчитанный максимальный результат - PullRequest
1 голос
/ 07 марта 2011

У меня есть запрос:

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', ''

Извините за детали, но мне сложно обдумать это!

EDIT:

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;

это был бы правильный способ сделать это? С помощью этого метода я получаю разные даты lastContact для одного и того же productID: (

Ответы [ 2 ]

1 голос
/ 07 марта 2011

Попробуйте это:

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;
0 голосов
/ 07 марта 2011

Если я вас правильно понимаю, вам нужен параметр, который находится в таблице, находящейся в конце N отношения 1: N, и вы хотите иметь только 1 из каждого.

Вы можете попробовать сгруппировать данные, используя GROUP BY. Что-то вроде:

SELECT sds_product_comms.*, MAX(sds_comms.created_at) FROM sds_product_comms AS pc
JOIN sds_comms c ON pc.comms_id = c.comms_id
GROUP BY sds_product_comms.prod_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...