php - MYSQL 获取最近的记录,然后在 where 子句中验证它的状态

标签 php mysql sql database mysqli

我在获取我想要的查询结果时遇到问题。在过去的几个小时里,我一直试图解决它,但一直无法解决。

表结构

CREATE TABLE `whs_Lot_header` (
  `iLotheaderid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `iUniqueid` varchar(20) DEFAULT NULL,
  `iImo` int(11) DEFAULT NULL,
  `cWarehousecode` varchar(10) DEFAULT '',
  `cOriginmembercode` varchar(4) DEFAULT '',
  `cDestinationmembercode` varchar(4) DEFAULT '',
  `cCustomeralias` varchar(25) DEFAULT '',
  `cFilenumber` varchar(30) DEFAULT '',
  `cLotnumber` varchar(20) DEFAULT '',
  `cHousebillofladingnumber` varchar(30) DEFAULT '',
  `cArrivalnoticenumber` varchar(30) DEFAULT '',
  `cCustomerreference` varchar(20) DEFAULT '',
  `cForwarderreference` varchar(20) DEFAULT '',
  `cShipperreference` varchar(20) DEFAULT '',
  `cPlaceofreceipt` varchar(5) DEFAULT '',
  `cPortofloading` varchar(5) DEFAULT '',
  `cPortofdischarge` varchar(5) DEFAULT '',
  `cPlaceofdelivery` varchar(5) DEFAULT '',
  `tReceiveddate` date DEFAULT '0000-00-00',
  `cWarehousestatus` varchar(5) DEFAULT '',
  `tStatusdate` date DEFAULT '0000-00-00',
  `bStopoff` enum('N','Y') NOT NULL DEFAULT 'N',
  `cComments` varchar(2048) DEFAULT '',
  `cVessel` varchar(30) DEFAULT '',
  `cIntransitto` varchar(5) DEFAULT '',
  `cTransitport` varchar(5) DEFAULT '',
  `tETATransitPort` date DEFAULT '0000-00-00',
  `cIntransitfrom` varchar(5) DEFAULT '',
  `tEtaintransitfrom` date DEFAULT '0000-00-00',
  `bContainerloaded` char(1) NOT NULL DEFAULT '',
  `cLoadplanreference` varchar(20) DEFAULT '',
  `cContainernumber` varchar(12) DEFAULT '',
  `cContainersealnumber` varchar(20) DEFAULT '',
  `cLoadplancomments` varchar(2048) DEFAULT '',
  `cVoyage` varchar(10) DEFAULT '',
  `iStatus` int(11) DEFAULT '0',
  `iEnteredBy` int(11) NOT NULL DEFAULT '0',
  `tEntered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `iUpdatedBy` int(11) NOT NULL DEFAULT '0',
  `tUpdated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`iLotheaderid`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1$$

CREATE TABLE `whs_Lot_lineitem` (
  `iLotlineitemid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `iLotheaderid` bigint(20) DEFAULT NULL,
  `cCommodity` varchar(254) DEFAULT '',
  `iPieces` int(11) DEFAULT NULL,
  `cUom` char(1) NOT NULL DEFAULT '',
  `nWeight` float(8,2) DEFAULT '0.00',
  `nCube` float(15,3) NOT NULL DEFAULT '0.000',
  `cOverdimensionflag` enum('N','Y') NOT NULL DEFAULT 'N',
  `cOverheightflag` enum('N','Y') NOT NULL DEFAULT 'N',
  `cOverlengthflag` enum('N','Y') NOT NULL DEFAULT 'N',
  `cOverweightflag` enum('N','Y') NOT NULL DEFAULT 'N',
  `cOverwidthflag` enum('N','Y') NOT NULL DEFAULT 'N',
  `cHazardous` enum('N','Y') NOT NULL DEFAULT 'N',
  `iStatus` int(11) DEFAULT '0',
  `iEnteredBy` int(11) NOT NULL DEFAULT '0',
  `tEntered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `iUpdatedBy` int(11) NOT NULL DEFAULT '0',
  `tUpdated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`iLotlineitemid`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1$$

查询

SELECT whs_Lot_header.cLotnumber,
       whs_Lot_header.cCustomerreference,
       whs_Lot_header.cPlaceofdelivery,
       whs_Lot_header.cVessel, 
       whs_Lot_header.tReceiveddate,
       whs_Lot_header.cWarehousestatus,
       whs_Lot_lineitem.cHazardous,
       whs_Lot_lineitem.iPieces,
       whs_Lot_lineitem.nWeight,
       whs_Lot_lineitem.cCommodity,
       whs_Lot_lineitem.nCube
 FROM whs_Lot_header,whs_Lot_lineitem
WHERE whs_Lot_header.iLotheaderid = whs_Lot_lineitem.iLotheaderid
  AND whs_Lot_header.iStatus = 0
  AND whs_Lot_lineitem.iStatus = 0
  AND whs_Lot_header.cWarehousecode IN ('HAMW')
  AND whs_Lot_header.cWarehousestatus = 'B'
GROUP BY whs_Lot_header.cLotnumber,whs_Lot_lineitem.cCommodity

问题 whs_Lot_header 表包含一个 cLotnumber 的多个记录,我只想检查最近记录的 cWarehousestatus

基本上我想设置一个 where 子句优先级,我想在只检查其状态之后检查最近的记录。

如果有人可以建议修改上述查询或提出新的问题查询,那将对我很有帮助。

提前致谢。

最佳答案

请查看以下查询是否解决了您的问题:

SELECT wlh.cLotnumber, wlh.cCustomerreference, wlh.cPlaceofdelivery, 
.....................
.....................
FROM whs_Lot_header wlh 

INNER JOIN 
(
    SELECT iLotheaderid, cLotnumber, cCommodity, MAX(tEntered) FROM whs_Lot_header 
        GROUP BY cLotnumber, cCommodity
) temp 
    ON
wlh.iLotheaderid = temp.iLotheaderid
AND wlh.cCommodity = temp.cCommodity
AND wlh.cWarehousecode IN ('HAMW')
AND wlh.cWarehousestatus = 'B'

INNER JOIN whs_Lot_lineitem  wll
    ON wlh.iLotheaderid = wll.iLotheaderid 


请注意,temp 中的 GROUP BY 子句基于原始问题中字段的 GROUP BY。同样,在给定查询中编写的条件类似于可以在此处使用 INNER JOIN 编写的条件。

关于php - MYSQL 获取最近的记录,然后在 where 子句中验证它的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41768658/

相关文章:

javascript - 使用 C3JS 的 x 轴上的多个值(时间序列)

php - 将 $_POST 关联数组插入数据库 PHP

MySQL Workbench 导入问题

mysql - 使用 WHERE 子句时更新 MySQL 中的多行

sql - dplyr 将列粘贴到远程数据库中

mysql - 从frm和ibd文件恢复表结构

php - Docker 使用 PHP 连接 MySQL 的问题

php - PDO: lastInsertId() 是一个单独的查询吗?

php - 通过 .htaccess 更改根文件夹

mysql - SQL Left Join a Table on a Left Joined Table