单行,包含SQL中多个其他行的可选数据

时间:2012-12-26 11:28:23

标签: mysql sql

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

我已尝试在线搜索帮助,但我无法确定哪些搜索字词会为我带来有用的结果。所以 - 我已经尝试了下面的解决方案 - 但我认为这不是最好的 - 而且我正在寻找有关如何改进它的建议。

更新

例如,所有行都有一些 required (非空)的列,但是有3列特定的不需要(可为空) ) - 即info1otherinfolastinfo

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

假设:

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

在这种情况下,我要返回的是第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;

0 个答案:

没有答案