Je veux obtenir la dernière MainNumber, série, Bartype et Notes pour un MainNumber
donné, si elles existent. Notez que BarType est stocké dans une table de recherche et référencé avec BarID.MySQL Obtenir dernier enregistrement par date de mutiple tables avec des valeurs de tables de consultation
Déraison est venu avec ceci:
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
Cela est bien si les billets est NULL
ou non, mais maintenant je besoin de la série et le Bartype. Un numéro principal peut avoir été affecté à plusieurs périodiques pendant sa durée de vie, mais je ne veux que le dernier numéro de série. (Je dois faire cela avec environ 15 autres champs dans d'autres tables, donc une réponse performante serait appréciée si possible)
Tables
Nombres Tableau:
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
Remarques Table :
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 Table:
CREATE TABLE `ref_bars` (
`BarID` varchar(6) NOT NULL,
`BarType` varchar(30) NOT NULL,
PRIMARY KEY USING BTREE (`BarID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
tableau
bars:
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
Données-échantillon
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'
Note: deux lignes pour MainNumber = 1, mais pas de rangée pour une MainNumber de deux. Les identifiants sont simplement techniques et ne sont jamais utilisés.
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'
Sortie prévue
MainNumber = 1
MainNumber,Notes,Banned,Unpaid
'1','replaced','Yes','Yes'
MainNumber = 2
MainNumber,Notes,Banned,Unpaid
'2','None','No','Yes'
Edit: fixe et testé, tout en rendant les choses plus claires (espérons-le). On m'a précipité pour faire d'autres choses plus tôt aujourd'hui, désolé de gaspiller le temps des gens avec une question mal écrite et incomplète.
Mise à jour pour clarifier les exigences plus complexes
pourriez-vous fournir quelques exemples de données?(avec résultat attendu) –
Comme l'écrit mastoj, vous obtiendrez * beaucoup * de meilleures réponses si vous postez un cas de test reproductible: Toutes les définitions de table (ou au moins assez pour exécuter le SQL), plus la requête complète que vous utilisez, plus données de test, plus le résultat attendu. – sleske
Vous pouvez simplement publier les données de test en tant que données CSV; cela devrait survivre à la mise en forme de stackoverflow, et est facile à importer. – sleske