简单的SQL与GROUP BY HAVING和WHERE

时间:2016-12-03 15:38:19

标签: mysql sql

我有一对多的桌子。表ticket和表solution。每张票都有几种解决方案。解决方案包含以下列:ticketIdstatusserviceId

因此,每张票可以通过一个或多个服务解决。 Status可以是:ready to resolvedone。只有一项服务可以为票证工作。但也有可用案例,其中所有票证解决方案的状态=已准备好解决。

我希望从所有票证的表对中获取:票证行 - 解决方案行,其中:serviceId = N且票证没有其他状态=已完成的服务。

我试着解决我的问题:

SELECT t.*, s.* FROM Ticket t 
JOIN Solution s ON t.id = s.ticketId 
WHERE s.serviceId = N 
GROUP BY s.ticketId HAVING SUM(CASE WHEN s.serviceId <> N AND s.status = 'done' THEN 1 ELSE 0 END) = 0;

但是这种方法不起作用,因为WHERE s.serviceId = N只选择一行和ofcouse,sum总是为0.如果我删除WHERE,那么sum start计算正确,但我从表solution得到总是第一行的票,但我想要服务= N的行。

我该如何解决?

实施例

Ticket T.解决方案:S1(服务= N,状态=准备好),S2(服务= K,状态=准备好) - &gt;得(T,S1)。

Ticket T.解决方案:S1(服务= N,状态=完成),S2(服务= K,状态=准备好) - &gt;得(T,S1)。

Ticket T.解决方案:S1(服务= N,状态=就绪),S2(服务= K,状态=完成) - &gt;空。

Ofcouse,S3,S4可以提供服务Q,W ......但无论如何:零或一个解决方案将有状态=已完成。

2 个答案:

答案 0 :(得分:0)

删除Where子句并尝试此Having子句

HAVING SUM(CASE WHEN s.serviceId = 'N' AND s.status = 'done' THEN 1 ELSE 0 END) = 0
   AND SUM(s.serviceId = 'N') > 0;

考虑N应为字符串

答案 1 :(得分:0)

首先使用子查询来识别任何服务不是Ticket的票证。然后将此结果加入Solution表,再次加入N,包括检查服务ID为SELECT t.*, s2.* FROM Ticket t INNER JOIN ( SELECT ticketId FROM Solution GROUP BY ticketId HAVING SUM(CASE WHEN s.status = 'done' THEN 1 ELSE 0 END) = 0 ) s1 ON t.id = s1.ticketId INNER JOIN Solution s2 ON s1.ticketId = s2.ticketId AND s2.serviceId = 'N' 的解决方案的条件。

<section id="app" class="numberpad">
    <section id="display" class="semi">
    <div class="semi mten">
      <span id="numerals"></span>
    </div>
  </section>
  <ul id="keypad" class="semi">
    <li id="one" class="key" role="button"><span class="number">1</span></li>
    <li id="two" class="key" role="button"><span class="number">2</span></li>
    <li id="three" class="key" role="button"><span class="number">3</span></li>
    <li id="four" class="key" role="button"><span class="number">4</span></li>
    <li id="five" class="key" role="button"><span class="number">5</span></li>
    <li id="six" class="key" role="button"><span class="number">6</span></li>
    <li id="seven" class="key" role="button"><span class="number">7</span></li>
    <li id="eight" class="key" role="button"><span class="number">8</span></li>
    <li id="nine" class="key" role="button"><span class="number">9</span></li>
    <li id="dot"><span class="number">&nbsp;</span></li>
    <li id="zero" class="key" role="button"><span class="number">0</span></li>
    <li id="back" role="button"><span class="number">X</span></li>
  </ul>          
</section>