Я хочу получить последние 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
или нет, но теперь янужен серийный номер и тип 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. Идентификаторы являются только техническими и никогда не используются.
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'
Ожидаемый результат
MainNumber = 1
MainNumber,Notes,Banned,Unpaid
'1','replaced','Yes','Yes'
MainNumber = 2
MainNumber,Notes,Banned,Unpaid
'2','None','No','Yes'
Редактировать: Исправлено и проверено, при этом все проясняется (надеюсь).Сегодня я был вынужден заняться другими делами, извиняюсь за трату времени людей на плохо написанный, неполный вопрос.
Обновлен для уточнения более сложных требований