1

我的数据库中有一个表,其中有多个相同的key. 我需要做的是拉回单行,其中包含每行的所有column信息,每行具有相同的key.

我已经尝试在网上寻求帮助,但我不知道哪些搜索词会给我带来有用的结果。所以 - 我已经尝试了下面的解决方案 - 但我认为它不是最好的 - 我正在寻找关于如何改进它的建议。

更新:

例如,所有行都有一些列是必需的(非空),但有 3 列具体是不需要的(可空的) - 即info1,otherinfolastinfo

所以 - 我想拉回一行,其中包含每行中所有必需的列。

假使,假设:

  • 第 2 行包含所有必需info1的列集,以及 和 的数据
  • 第 3 行设置了所有必填列 - 但所有非必填字段都没有数据。这意味着应该跳过第 3 行。
  • 第 4 行设置了所有必需的列 - 以及 和的info1数据otherinfolastinfo

在这种情况下,我想要返回的是来自第 1行、第 2 行、第 3 行和第 4 行的所需数据(跳过,因为它已经由第 2 行设置)。info1otherinfolastinfoinfo1

到目前为止,这是我的代码:

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;
4

0 回答 0