donv29560 2014-01-17 15:04
浏览 138
已采纳

使用php中的group_concat列出空值

I have the following query:

$query4 = $db->query("SELECT count(codes.lcfruh) AS front_lcfruh, kw, datum,   GROUP_CONCAT(name) AS name FROM codes 
RIGHT JOIN dienstplan ON (dienstplan.schicht = codes.lcfruh OR dienstplan.schicht = codes.lcteildienst OR dienstplan.schicht = codes.lcshteil) 
RIGHT JOIN personal ON personal.perso_id = dienstplan.perso_id 
WHERE personal.status_sum = 'rezeption' AND dienstplan.schicht!='' AND dienstplan.kw = '$kw' AND personal.zeigen='ja' 
GROUP BY dienstplan.datum");

I want to have a result of 7 input fields (for every day of the week). That works correct. Both fields with the 0 or value greate than 0 are listed, actually input field are created.

while ($result = $query4 ->fetch_object()) {
echo '<p class="taglist1"><input name="" type="text" title="'.$result->name.'" class="zbroj'.$result->front_lcfruh.'" value="'.$result->front_lcfruh.'"></p>';
}

In the title I want to have names listed if they have certain value, that is working also UNTIL I put the following line in the code in the WHERE CLAUSE

AND (dienstplan.schicht = codes.lcfruh OR dienstplan.schicht = codes.lcteildienst OR     dienstplan.schicht = codes.lcshteil) 

The problem is the following in this case The result is not showing the fields that are not matching, where I should have the count(codes.lcfruh)=0. The fields that are not matching are not shown.

Is there a chance that I can put this line elsewhere in the code in order to get the null fields listed also.

  • 写回答

1条回答 默认 最新

  • douben6670 2014-01-17 15:11
    关注

    The code that you are putting into the where clause is:

    AND (dienstplan.schicht = codes.lcfruh OR
         dienstplan.schicht = codes.lcteildienst OR
         dienstplan.schicht = codes.lcshteil
        ) 
    

    Although you don't intend for this to be the case, this is also adding the conditions:

    dienstplan.schicht is not null and
    (codes.lcfruh is not null or dienstplan.schicht is not null OR dienstplan.schicht is not null)
    

    Because NULL values are treated as false in the where. This "undoes" the right outer join.

    The solution is to move the conditions to the on clause. Alternatively, you could add additional or clauses specifying that NULL is an ok value.

    EDIT:

    Try changing the where clause to:

    AND (dienstplan.schicht = codes.lcfruh OR
         dienstplan.schicht = codes.lcteildienst OR
         dienstplan.schicht = codes.lcshteil OR
         dienstplan.schicht is null or
         (codes.lcfruh is null and codes.lcteildienst is null and codes.lcshteil is null)
        ) 
    

    This will keep the rows that fail the right outer join.

    EDIT II:

    Next idea. Move the condition to the group_concat(). If the first query is working, then maybe this is what you want:

    GROUP_CONCAT(case when dienstplan.schicht = codes.lcfruh OR
                           dienstplan.schicht = codes.lcteildienst OR
                           dienstplan.schicht = codes.lcshteil
                      then ''
                      else name
                 end)
    

    If this doesn't work, then edit your question with sample data and desired results.

    EDIT III:

    Is this what you want?

    SELECT count(case when personal.status_sum = 'rezeption' AND dienstplan.kw = '52'
                      then codes.lcfruh
                 end) AS front_lcfruh,
           kw, datum,
           GROUP_CONCAT(case when personal.status_sum = 'rezeption' AND dienstplan.kw = '52'
                             then name
                        end) AS name
    FROM codes
    RIGHT JOIN dienstplan ON (dienstplan.schicht = codes.lcfruh)
    RIGHT JOIN personal ON personal.perso_id = dienstplan.perso_id
    GROUP BY dienstplan.datum;
    

    I moved the conditions into the select statement, so all the rows would appear.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配