MySQL合并为某些null,而不是所有null

时间:2009-07-23 07:13:49

标签: mysql null conditional coalesce

我有一个查询员工日程安排数据库的MySQL查询,并且(由于之前的stackoverflow问题)返回用户没有“不工作”的任何日子,所以如果用户周四没有工作,即使日期没有出现在原始结果集中,查询也会填写该日期(因此我不必通过PHP脚本填写这些空格)。

现在的问题是,如果用户在两周后检查计划,则整周显示“无工作”。如果没有结果,脚本应输出“抱歉,本周没有发布时间表”,这样用户就不会误以为他有休息一周,并且知道稍后再回来查看。

所以问题是: 什么是最好的查询语法,如:

SELECT 
If Count(*) > 0 {
COALESCE(gooddata, nulldata) AS thedata
etc.
etc.
FROM sched_table
WHERE dates BETWEEN xxx AND yyy

如果所有行都为null(或count为0),则它不会返回任何行。

我尝试为计数添加一个列并让脚本输出“未发布”并在一次迭代后退出,但是在好几周后它仍然会在一次迭代后退出,所以我感到很沮丧。

我确信如果我退后一步,我可以让脚本做我想做的事,但我很好奇是否有办法在查询中做到这一点,所以必须至少一行非Null值,以便合并其他空行。

3 个答案:

答案 0 :(得分:2)

我实际上认为使用数据库进行行级格式化/条件输出操作可能会走得太远。 PHP实际上比MySQL更快地进行字符串比较和算术运算。我与之合作的开发人员之间的不成文政策一直是我们不使用数据库来格式化我们的输出,我认为你正在进入那个领域,你正在这里做什么。

我有兴趣知道其他人是否同意这个建议。我实际上可能将它作为一个新问题发布...在使用数据库格式化输出时,在哪里绘制线条?

答案 1 :(得分:2)

哦,不,有两个内部选择的连接,其中一个有条件的EXISTS?你是认真的吗?如何使用简单的UNION来填空? :)像

这样的东西

SELECT real_week_data 联盟 SELECT fake_empty_week;

这个UNION甚至可以为你提供独特的结果,为你提供你想要的东西..

答案 2 :(得分:0)

您的查询最有可能与某种行集连接,以生成一周中的所有日期。

在该行集中添加条件:

SELECT  COALESCE(gooddata, nulldata) AS thedata
FROM    (
        SELECT  *
        FROM    days_of_week
        WHERE   EXISTS
                (
                SELECT  NULL
                FROM    sched_data
                WHERE   dates BETWEEN xxx AND yyy
                )
        )
LEFT OUTER JOIN
        sched_data
WHERE   dates BETWEEN xxx AND yyy