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

    −165

    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
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    $sql = 'SELECT * FROM 
                        (SELECT COUNT(company.id) as cnt_company , 
                        FROM_DAYS(TO_DAYS( company.created_at )) as day 
                            FROM company
                        JOIN contact ON contact.company_id = company.id
                        JOIN issuer ON issuer.id = company.issuer_id
                        JOIN bill ON bill.company_id = company.id
                            WHERE contact.partner_id ='.$this->_partner->getId().'
                            AND company.created_at '.$query.'
                        GROUP BY day) as A 
                    LEFT JOIN
                        (SELECT COUNT(process.id) as finished, 
                        FROM_DAYS(TO_DAYS( process.finished_at )) as day2 
                            FROM process
                        JOIN bill on bill.id= process.bill_id
                        JOIN company ON bill.company_id = company.id
                        JOIN contact ON contact.company_id = company.id
                        JOIN issuer ON issuer.id = company.issuer_id
                            WHERE contact.partner_id ='.$this->_partner->getId().'
                            AND issuer.signature_article_id = bill.article_id
                        GROUP BY day2) as B ON A.day = B.day2
                    LEFT JOIN
                        (SELECT COUNT( * ) as count,
                        FROM_DAYS(TO_DAYS(click.created_at)) as day3,
                        COUNT( DISTINCT click.ip ) as uniq 
                            FROM click 
                        WHERE click.partner_id = '.$this->_partner->getId().'
                        AND click.created_at '.$query.'
                           GROUP BY day3)  as C ON A.day = C.day3
                    UNION
                    SELECT * FROM 
                        (SELECT COUNT(company.id) as cnt_company , 
                        FROM_DAYS(TO_DAYS( company.created_at )) as day 
                            FROM company
                        JOIN contact ON contact.company_id = company.id
                        JOIN issuer ON issuer.id = company.issuer_id
                        JOIN bill ON bill.company_id = company.id
                            WHERE contact.partner_id ='.$this->_partner->getId().'
                            AND DATE(company.created_at)'.$query.'
                        GROUP BY day) as A 
                    RIGHT JOIN
                        (SELECT COUNT(process.id) as finished, 
                        FROM_DAYS(TO_DAYS( process.finished_at )) as day2 
                            FROM process
                        JOIN bill on bill.id= process.bill_id
                        JOIN company ON bill.company_id = company.id
                        JOIN contact ON contact.company_id = company.id
                        JOIN issuer ON issuer.id = company.issuer_id
                            WHERE contact.partner_id ='.$this->_partner->getId().'
                        AND issuer.signature_article_id = bill.article_id
                        GROUP BY day2 ) as B ON A.day = B.day2
                    RIGHT JOIN
                        (SELECT COUNT( * ) as count,
                        FROM_DAYS(TO_DAYS(click.created_at)) as day3,
                        COUNT( DISTINCT click.ip ) as uniq 
                            FROM click 
                        WHERE click.partner_id = '.$this->_partner->getId().'
                        AND click.created_at '.$query.'
                           GROUP BY day3)  as C ON A.day = C.day3';

    T_T

    Запостил: raga, 15 Июня 2012

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

    • > LEFT JOIN
      >UNION
      >RIGHT JOIN
      Вполне типичный код для Sybase ASE/MS SQL, версии которых не поддерживают full outer join.
      >() as B ON A.day = B.day2
      Вполне типичный код для Sybase ASE/MS SQL, версии которых не поддерживают with и прочие ништяки.

      > UNION
      Тут говняно. Лучше Union All.
      Ответить
      • а взглянув на
        > $sql =
        понимаешь, что это не хитрый план запроса, а просто так получилось
        Ответить
      • > MS SQL, версии которых не поддерживают full outer join
        С 7.0 так точно есть, это ж насколько древнюю версию надо искать?
        > MS SQL, версии которых не поддерживают with и прочие ништяки.
        С 2000 версии есть.

        ИМХО, у автора кода просто своё видение запроса. Нестандартное такое. Изощренное.
        Ответить
        • Хотя наверное нет - я ошибся c базой.
          >$sql
          Не заметил. Это ж пхп и значит говномускул.
          А там тоже бока с full outer join. И вроде witha нету.
          Ответить
          • Ну PHP никто не мешает работать с MS SQL и Sybase ASE.
            Ответить
            • Это да, но я предполагаю наиболее вероятный вариант.
              Короче видел такие конструкции в одном древнем проекте, писали их именно по указанным выше причинам.

              Конечно тупая склейка строк (могли б дублирование и устранить), и отказ от prepared statements - говно.
              Ответить

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