我想获取给定的最新 MainNumber、Serial、BarType 和 Notes MainNumber
(如果存在)。请注意,BarType 存储在查找表中并使用 BarID 进行引用。
Unreason 想出了这个:
SELECT @MainNumber, COALESCE(n.Notes, 'None')
FROM numbers
LEFT JOIN notes n ON numbers.MainNumber = n.MainNumber
LEFT JOIN notes n2 ON n.MainNumber = n2.MainNumber AND n.Date < n2.Date
WHERE n2.Date IS NULL AND numbers.MainNumber = @MainNumber
无论 Notes 是否存在都NULL
可以,但现在我需要 Serial 和 BarType。MainNumber 在其生命周期内可能已分配给多个序列,但我只想要最新的序列。(我需要对其他表中的大约 15 个其他字段执行此操作,因此在可能的情况下将不胜感激)
表
数字表:
CREATE TABLE `numbers` (
`ID` int(10) unsigned NOT NULL auto_increment,
`MainNumber` varchar(11) NOT NULL,
`Serial` varchar(20) NOT NULL,
`Date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`),
UNIQUE KEY `Serial` (`Serial`)
) ENGINE=MyISAM AUTO_INCREMENT=460 DEFAULT CHARSET=latin1
备注表:
CREATE TABLE `notes` (
`ID` int(10) unsigned NOT NULL auto_increment,
`MainNumber` varchar(11) NOT NULL,
`Notes` longtext NOT NULL,
`Date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`),
KEY `MainNumber` (`MainNumber`)
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC
ref_bars 表:
CREATE TABLE `ref_bars` (
`BarID` varchar(6) NOT NULL,
`BarType` varchar(30) NOT NULL,
PRIMARY KEY USING BTREE (`BarID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
条形表:
CREATE TABLE `bars` (
`ID` int(10) unsigned NOT NULL auto_increment,
`MainNumber` varchar(11) NOT NULL,
`BarID` varchar(6) NOT NULL,
`Date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`),
KEY `MainNumber` (`MainNumber`)
) ENGINE=MyISAM AUTO_INCREMENT=212 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC
样本数据
SELECT * FROM notes
:
'ID','MainNumber','Notes','Date'
'1','1','repaired','2009-03-23 12:00:00'
'2','1','replaced','2009-08-15 19:20:05'
注意:MainNumber = 1 有两行,但 MainNumber 为 2 没有行。ID 只是技术性的,从未使用过。
SELECT * FROM numbers
:
'ID','MainNumber','Serial','Date'
'1','1','4642785154854','2008-08-15 12:30:00'
'2','1','4642315642316','2009-08-15 12:50:00'
'3','2','5412558456223','2010-08-15 11:30:00'
SELECT * FROM bars
:
'ID','MainNumber','BarID','Date'
'1','1',1,'2008-08-15 12:30:00'
'2','1',2,'2009-08-15 12:50:00'
'3','2',2,'2010-08-15 11:30:00'
SELECT * FROM ref_bars
:
'BarID','BarType'
'1','Banned'
'2','Payment required'
预期产出
主号码 = 1
MainNumber,Notes,Banned,Unpaid
'1','replaced','Yes','Yes'
主号码 = 2
MainNumber,Notes,Banned,Unpaid
'2','None','No','Yes'
编辑:修复并测试它,同时使事情更清晰(希望如此)。今天早些时候我被赶去做其他事情,很抱歉用一个写得不好、不完整的问题浪费了人们的时间。
更新以阐明更复杂的要求