2014-02-19 3 views
0

Есть ли способ упростить запрос ниже? Я получил то, что хотел, но хочу узнать, как добиться результата, используя более короткий запрос. Что касается результата, могу ли я заменить значение NULL на 0?Упрощение запроса MYSQL

 
SELECT ad.Staff, 
     ad.TYear, 
     ad.TWeek, 
     b.TMonth 
    FROM (SELECT a.Staff, 
       a.TYear, 
       d.TWeek 
      FROM (SELECT t2.creatorfullname AS Staff, 
         count(distinct(t1.ticketmaskid)) AS TYear 
       FROM swtickets t1 
         JOIN swticketauditlogs t2 
          ON t1.ticketid = t2.ticketid 
       WHERE (YEAR(from_unixtime(t2.dateline)) = YEAR(CURRENT_TIMESTAMP) 
         AND FIND_IN_SET (t2.creatorfullname,'Andy Murray,Rafael Nadal,Maria Sharapova') > 0 
         AND t2.actionmsg LIKE '%Ticket status changed from: % to: Closed%') 
         AND totalreplies > 0 
       GROUP BY t2.creatorfullname) AS a 
       LEFT OUTER JOIN (SELECT t2.creatorfullname AS Staff, 
             count(distinct(t1.ticketmaskid)) AS TWeek 
            FROM swtickets t1 
             JOIN swticketauditlogs t2 
              ON t1.ticketid = t2.ticketid 
            WHERE (WEEK(from_unixtime(t2.dateline)) = WEEK(CURRENT_TIMESTAMP) 
             AND FIND_IN_SET (t2.creatorfullname,'Andy Murray,Rafael Nadal,Maria Sharapova') > 0 
             AND t2.actionmsg LIKE '%Ticket status changed from: % to: Closed%') 
             AND totalreplies > 0 
           GROUP BY t2.creatorfullname) AS d 
           ON (a.Staff = d.Staff)) AS ad 
       LEFT OUTER JOIN (SELECT t2.creatorfullname AS Staff, 
             count(distinct(t1.ticketmaskid)) AS TMonth 
            FROM swtickets t1 
             JOIN swticketauditlogs t2 
              ON t1.ticketid = t2.ticketid 
            WHERE (MONTH(from_unixtime(t2.dateline)) = MONTH(CURRENT_TIMESTAMP) 
             AND FIND_IN_SET (t2.creatorfullname,'Andy Murray,Rafael Nadal,Maria Sharapova') > 0 
             AND t2.actionmsg LIKE '%Ticket status changed from: % to: Closed%') 
             AND totalreplies > 0 
           GROUP BY t2.creatorfullname) AS b 
           ON (ad.Staff = b.Staff); 
 
+----------------+-------+-------+--------+ 
| Staff   | TYear | TWeek | TMonth | 
+----------------+-------+-------+--------+ 
| Andy Murray | 337 | 37 | 142 | 
| Rafael Nadal | 49 | NULL |  13 | 
| Maria Sharapova| 49 |  1 |  4 | 
+----------------+-------+-------+--------+ 
+0

Удаленный тег sql-server, потому что вопрос явно о MySQL. –

+1

, пожалуйста, предоставьте некоторые примерные данные с ожидаемым выходом –

+0

. Здесь мы снова ждем @Gordon – Hackerman

ответ

1

Try:

SELECT t2.creatorfullname AS Staff, 
     count(distinct case when YEAR(from_unixtime(t2.dateline)) = YEAR(CURRENT_TIMESTAMP) 
         then t1.ticketmaskid end) AS TYear, 
     count(distinct case when WEEK(from_unixtime(t2.dateline)) = WEEK(CURRENT_TIMESTAMP) 
         then t1.ticketmaskid end) AS TWeek, 
     count(distinct case when MONTH(from_unixtime(t2.dateline)) = MONTH(CURRENT_TIMESTAMP) 
         then t1.ticketmaskid end) AS TMonth 
FROM swtickets t1 
JOIN swticketauditlogs t2 
     ON t1.ticketid = t2.ticketid 
WHERE FIND_IN_SET (t2.creatorfullname,'Andy Murray,Rafael Nadal,Maria Sharapova') > 0 
    AND t2.actionmsg LIKE '%Ticket status changed from: % to: Closed%' 
    AND totalreplies > 0 
GROUP BY t2.creatorfullname 



- редактировать -

Этот подход может быть использован, когда нам нужно подсчитать количество записей, которые удовлетворяют многих условий.
При таком подходе мы используем простейшую форму случае выражение в:

CASE WHEN condition THEN expression1 [ ELSE expression2 ] END

Выражение случае работает как IF заявление - он оценивает состояние, и если условие истинно, то возвращает результат первого выражение, в противном случае результат второго выражения, или - когда второе выражение не задано (часть пропущена) - он возвращает NULL.
MySql имеет функцию IF: IF(expr1,expr2,expr3), которая работает так же, как и выражения case, однако выражения case являются частью ANSII SQL Standard и реализуются большинством баз данных, а функция IF является частным расширением MySql.
Пожалуйста, обратите внимание на эту ссылку для деталей: https://dev.mysql.com/doc/refman/5.6/en/control-flow-functions.html

запрос, чтобы подсчитать количество записей может выглядеть, например, как:

SELECT count(*), 
     count(some_column), 
     count(CASE WHEN condition1 THEN 1 END), 
     count(IF(condition2, 1, null)), 
     sum(CASE WHEN condition3 THEN 1 ELSE 0 END), 
     count(DISTINCT CASE WHEN condition4 THEN some_column END), 
     count(DISTINCT IF(condition2, 1, some_column)) 
FROM sometable 

COUNT(*) - подсчитывает общее количество строк
COUNT(expression) - подсчитывает число строк, когда expression не является нулевым (он пропускает нулевые значения) COUNT(DISTINCT expression) - то же, что указано выше, но учитывает только отдельные значения



count(DISTINCT CASE WHEN condition THEN some_column END)

- для каждой строки он оценивает condition и возвращает значение some_column, когда условие истинно, иначе возвращает значение null. Поскольку пустые значения пропускаются, они подсчитывают только разные значения для строк, удовлетворяющих условию.

+0

именно там, где я собирался, но ожидал, что таблица «totalreplies» была такой, какой она не была закрыта. – DRapp

+0

Его из таблицы t1. – user1204671

+0

Это работает. Ужасно! Поэтому мне не нужно использовать LEFT OUTER JOIN, а также объединиться. Не могли бы вы немного объяснить – user1204671

Смежные вопросы