データベースに、同じ を持つ複数のエントリを持つテーブルがありますkey
。column
私がする必要があるのは、同じ行を持つ各行のすべての情報を持つ単一の行を引き戻すことですkey
。
これについてオンラインでヘルプを検索しようとしましたが、どの検索用語が有用な結果をもたらすのかわかりません。だから - 私は以下の解決策を試しました - しかし、私はそれが最善だとは思いません - そして、それを改善する方法についてのアドバイスを探しています.
アップデート:
例として、すべての行に必要な(null 以外の)列がいくつかありますが、特定の 3 つの列は必須ではありません(null 可能) - つまりinfo1
、otherinfo
とlastinfo
です。
そのため、各行から必要なすべての列を含む単一の行を引き戻したいと思います。
と仮定する:
- 行 2 には、必要なすべての列セットと、
info1
、およびのデータが含まれています。 - 行 3 には必要な列がすべて設定されていますが、必須でないフィールドにはデータがありません。これは、行 3 をスキップする必要があることを意味します。
- 行 4 には、必要なすべての列が設定されています
info1
。otherinfo
lastinfo
この場合、私が返したいのは、行 1 からの必要なinfo1
データ、行 2 からのデータ、行 3 からのデータ、およびotherinfo
行4 のデータです (行 2 で既に設定されているためlastinfo
スキップします)。info1
これまでの私のコードは次のとおりです。
SELECT a.*,
IFNULL(a.info1, IFNULL(b.info1, IFNULL(c.info1, null))) AS info1
, IFNULL(a.otherinfo, IFNULL(b.otherinfo, IFNULL(c.otherinfo, null))) AS otherinfo
, IFNULL(a.lastinfo, IFNULL(b.lastinfo, IFNULL(c.lastinfo, null))) AS lastinfo
FROM entries a
LEFT JOIN entries b ON (
a.key = b.key && (
(a.info1 IS NULL && b.info1 IS NOT NULL) ||
(a.otherinfo IS NULL && b.otherinfo IS NOT NULL) ||
(a.lastinfo IS NULL && b.lastinfo IS NOT NULL)
)
)
LEFT JOIN entries c ON (
a.key = c.key && (
(a.info1 IS NULL && c.info1 IS NOT NULL) ||
(a.otherinfo IS NULL && c.otherinfo IS NOT NULL) ||
(a.lastinfo IS NULL && c.lastinfo IS NOT NULL)
)
)
LEFT JOIN entries d ON (
a.key = d.key && (
(a.info1 IS NULL && d.info1 IS NOT NULL) ||
(a.otherinfo IS NULL && d.otherinfo IS NOT NULL) ||
(a.lastinfo IS NULL && d.lastinfo IS NOT NULL)
)
)
WHERE a.key = @_id
ORDER BY a.createdate DESC,
b.createdate DESC,
c.createdate DESC,
d.createdate DESC
LIMIT 1;
更新:次のコードで解決しました:
SELECT e.*,
e2.info1 AS info1,
e3.otherinfo AS otherinfo,
e4.lastinfo AS lastinfo
FROM entries AS e
LEFT JOIN entries AS e2 ON (
e.key = e2.key && (e.info1 is null && e2.info1 IS NOT NULL)
)
LEFT JOIN entries AS e3 ON (
e.key = e3.key && (e.otherinfo is null && e3.otherinfo IS NOT NULL)
)
LEFT JOIN entries AS e4 ON (
e.key = e4.key && (e.lastinfo IS NULL && e4.lastinfo IS NOT NULL)
)
WHERE e.key = @_id
ORDER BY e.createdate DESC,
e2.createdate DESC,
e3.createdate DESC,
e4.createdate DESC
LIMIT 1;