MySQL に次の 3 つのテーブルがあります。
+----------------------------------------------+
| ComputerConfigs |
+----------+-----------------------------------+
| ConfigID | ComputerID | LastChangeDate | ... |
+----------+-----------------------------------+
+-------------------+
| Software |
+------------+------+
| SoftwareID | Name |
+------------+------+
+-----------------------------------------------------+
| ComputerHasSoftware |
+------------+----------------------------------------+
| ComputerID | ConfigID | SoftwareID | LastChangeDate |
+------------+----------------------------------------+
ComputerConfig が変更されるたびに、新しい行が に書き込まれComputerConfigs
ます。ですから、過去からのすべての変化も見ることができます。
現在、ソフトウェアの変更も追跡しようとしています。これはそれほど頻繁には発生しないためComputerHasSoftware
、誰かが実際に何かを追加または削除した場合にのみ、新しい行をテーブルに保存したいと考えています。
インストールされているソフトウェアを使用して(ComputerConfigs
過去から現在まで)すべてを返すクエリを書きたいと思います。したがって、に属する行が追加されていない場合は、ComputerConfig のタイムスタンプの前に最新のものを取得する必要があります。ComputerHasSoftware
ComputerConfig
3 つのテーブルを単純に結合する、次のようなクエリを実行することを考えました。
SELECT
FROM ComputerConfigs
LEFT OUTER JOIN ComputerHasSoftware
ON ComputerHasSoftware.ComputerID = ComputerConfigs.ComputerID
LEFT OUTER JOIN Software
ON Software.SoftwareID = ComputerHasSoftware.ComputerID
しかし、ご想像のとおり、このクエリは間違った結果を導きます。これは、古いソフトウェアをそこに属さないコンピュータに関連付けるためです。結合条件を に変更してComputerHasSoftware.ConfigID = ComputerConfigs.ConfigID
も機能しません。これは、データが提供されていないものを見逃し、代わりに利用可能な最新のものにフォールバックする必要があるためです。
これを達成するためにクエリを変更するにはどうすればよいですか? それとも、サブクエリを使用したより良い解決策がありますか?