1. SQL / Говнокод #13760

    −166

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    //В рот мне ноги!
    SELECT A.id, MAX(B.date) FROM helpdesk_reference as A
    JOIN helpdesk_data as B on B.reference_id = A.id and B.date < DATE_SUB(NOW(), INTERVAL 7 DAY) and B.read = 1
    JOIN det1order as C on C.orderdate = order_date and C.ordernum = `order` and A.code = C.code and A.ch = C.ch
    JOIN det1order as D ON D.orderdate = order_date and D.ordernum = `order` and A.code = D.code and A.ch = D.ch and C.num = -D.num
    WHERE status = 3 and acl_id = 4
    GROUP BY A.id
    UNION ALL (
        SELECT A.id, MAX(B.date)
        FROM helpdesk_reference as A
        JOIN helpdesk_data  as B ON B.reference_id = A.id and B.date < DATE_SUB(NOW(), INTERVAL 7 DAY) and B.read = 1
        JOIN det1order as C ON  `order` = ordernum and order_date = orderdate and C.code = A.code and A.ch = C.ch and A.user = C.user
        WHERE acl_id IN(3, 4) and status = 3 and num = realized
        GROUP BY A.id
    );

    =(

    Запостил: heyzea1, 10 Сентября 2013

    Комментарии (15) RSS

    • SELECT
              IF(parent_user, CONCAT(parent_user, '(', helpdesk_reference.user, ')'), helpdesk_reference.user) as user,
              IF(name, name, detuser1c.title) as title, description, helpdesk_reference.id,
              helpdesk_reference.status, helpdesk_reference.direction, helpdesk_reference.importance,
              helpdesk_reference.order, helpdesk_reference.code,      helpdesk_reference.ch, helpdesk_reference.manager_from_1C,
              (
                      SELECT date FROM helpdesk_data
                      WHERE helpdesk_data.reference_id = helpdesk_reference.id
                      ORDER BY date LIMIT 1
              ) as date,
              (
                      SELECT count(id) FROM helpdesk_data
                      WHERE
                              helpdesk_data.reference_id = helpdesk_reference.id AND
                              helpdesk_data.user_id = helpdesk_reference.user AND
                              NOT `read`
              ) as unread
              FROM helpdesk_reference
              LEFT JOIN helpdesk_acl_description ON helpdesk_acl_description.acl_id = helpdesk_reference.acl_id
              LEFT JOIN guestprofiles ON helpdesk_reference.user = guestprofiles.user
              LEFT JOIN detuser1c ON  IF(parent_user, parent_user, helpdesk_reference.user) = detuser1c.user
              WHERE helpdesk_reference.status $archive  $filter
              ORDER BY helpdesk_acl_description.sort_priority DESC, description, status DESC, date, helpdesk_reference.user
      Ответить
      • Т.е. Вы ОП переписали вот в это?

        ЗЫЖ Адепты мускуля, плиз, объясните:
        AND  NOT `read`

        Как это?
        Ответить
        • И не читать!
          Ответить
        • false это по идее. В мускуле очень мягкие приведения типов.
          Ответить
          • Тогда я смысла этого:
            helpdesk_data.reference_id = helpdesk_reference.id AND
                                    helpdesk_data.user_id = helpdesk_reference.user AND
                                    NOT `read`

            НЕ понимаю.
            Одни AND и в конце hardcoded false => false.
            Ответить
            • Тьфу, что я написал то... Волосатый `read` спутал со строкой 'read', совсем голова не варит сегодня...

              В общем если в поле `read` лежит 0, false, или пустая строка, то он вернет 1 аля true, если там лежит null, то вернет null, если что-то другое - то 0 аля false. Вот.

              Под мягким приведением типа имелось в виду то, что он не гнушается складывать числа и строки и юзать в условиях строки и прочую гадость (включая подзапросы, возвращающие много строк), при этом делая неявные касты.
              Ответить
              • А, блин, там другие кавычки. Я тоже подумал о константе.
                Ответить
                • Кстати, 'вот такие кавычки' распознаются как строки во всех СУБД?
                  Ответить
                  • Согласно http://savage.net.au/SQL/sql-92.bnf.html

                    <quote> ::= '

                    А там каждая СУБД решает нарушать или нет стандарт.
                    Ответить
        • нет, скинул говно рядом
          Ответить
    • --В рот мне ноги!
      Ответить
    • Зачем UNION ALL в скобках.
      Базы C и D это фильтры перед UNION ALL. Очевидно, что D убирает чуть больше чем C, тогда зачем же этот C нужен.
      Да и сам запрос не понятно для чего. Вывод какой-то статистики по пользователям и номерам?
      Ответить
      • система тикетов
        Ответить
        • Можете сказать, где здесь поддержка, где пользователь, и что возвращает. Опубликованный вами в первом посте код похоже или для другой или немного для другой цели.
          Ответить
    • Шикарные алиасы для таблиц, главное - всё сразу очевидно.
      Ответить

    Добавить комментарий