2つのテーブルaとbがあるとします。列IDはテーブルaで一意ですが、テーブルbに複数のエントリがあり、列xとそのテーブルの他の列の値が異なります。テーブルbの主キーは(id、x)です。
次のようにMAXで実行できるように、 bからSELECTクエリに単一の行を結合できる必要があります。
SELECT * FROM a
INNER JOIN b USING(id)
WHERE b.x = (SELECT MAX(x) FROM b WHERE b.id = a.id)
MAXでは、これは問題なく機能します。しかし、MAXは必要ありません。私は実際にこのようなものが必要です:
SELECT * FROM a
INNER JOIN b USING(id)
WHERE b.x = (SELECT x FROM b
WHERE x IN (2,3,7) OR x IS NULL
ORDER BY FIELD(x,3,2,7) DESC
LIMIT 1)
私のMySQLバージョンはこのサブクエリでLIMITをサポートしていないため、このクエリは失敗します。私が提供した順序で少なくとも1つの行を確実に結合する別の方法はありますか?
私がやろうとしていることの概略図は次のようになります。
Select * from table a for each id
Join table b where x = 7
If no entry in b exists where a.id=b.id and x = 7, join b where x = 2
If no entry in b exists where a.id=b.id and x IN (2,7), join b where x = 3
If no entry in b exists where a.id=b.id and x IN (2,3,7), join b where x IS NULL
私にはこの必要性があります:
- 必要なこの特定のコードでは、複数のクエリを使用することはできません。それは1つの魔法のオールインワンクエリでなければなりません
- INNER JOIN(SELECT *)ステートメントを使用できません
- IDが複数回存在するクエリを実行することはできません(したがって、テーブルbの値が異なる可能性があるため、DISTINCTはオプションではありません)
- テーブルbにa.idのエントリがあり、xが2、3、7、またはNULLのいずれかであることは確かですが、どちらかはわかりません。また、a.idのエントリがいくつあるかもわかりません。表b。
- MySQLのアップグレードは、このコードが私の顧客の汎用サーバーで機能する必要があるため、最善のオプションではありません
つまり、私の質問は、MAX値の代わりに特定の順序を考慮に入れることができるMAXに似た関数はありますか?
前もって感謝します!