我的数据库中有一个表,其中有多个相同的key
. 我需要做的是拉回单行,其中包含每行的所有column
信息,每行具有相同的key
.
我已经尝试在网上寻求帮助,但我不知道哪些搜索词会给我带来有用的结果。所以 - 我已经尝试了下面的解决方案 - 但我认为它不是最好的 - 我正在寻找关于如何改进它的建议。
更新:
例如,所有行都有一些列是必需的(非空),但有 3 列具体是不需要的(可空的) - 即info1
,otherinfo
和lastinfo
。
所以 - 我想拉回一行,其中包含每行中所有必需的列。
假使,假设:
- 第 2 行包含所有必需
info1
的列集,以及 和 的数据 - 第 3 行设置了所有必填列 - 但所有非必填字段都没有数据。这意味着应该跳过第 3 行。
- 第 4 行设置了所有必需的列 - 以及 和的
info1
数据otherinfo
lastinfo
在这种情况下,我想要返回的是来自第 1行、第 2 行、第 3 行和第 4 行的所需数据(跳过,因为它已经由第 2 行设置)。info1
otherinfo
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;