我的数据库中有一个表,其中有多个条目具有相同的key
。我需要做的是撤回一行,其中包含每行具有相同column
的所有key
信息。
我已尝试在线搜索帮助,但我无法确定哪些搜索字词会为我带来有用的结果。所以 - 我已经尝试了下面的解决方案 - 但我认为这不是最好的 - 而且我正在寻找有关如何改进它的建议。
更新
例如,所有行都有一些 required (非空)的列,但是有3列特定的不需要(可为空) ) - 即info1
,otherinfo
和lastinfo
。
所以 - 我想拉回一行,其中包含每行中所有必需的列。
假设:
info1
的数据和info1
,otherinfo
和lastinfo
在这种情况下,我要返回的是第1行的必需数据,第2行的info1
,第3行的任何内容,以及otherinfo
和{第1行{1}}(跳过lastinfo
,因为它已由第2行设置)。
到目前为止,这是我的代码:
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;