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

    −172

    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
    SELECT SQL_CALC_FOUND_ROWS 
    `TLogindetails`.`name` AS `username`, `TLogindetails`.`firstname` AS `userfirstname`, `TOrders`.*, 
    `author`.`firstname` as `author_firstname`, `author`.`name` as `author_name`, `author`.`secondname` as `author_secondname`, `author`.`in_fio` as `author_in_fio`
    
    FROM `TOrders`
    
    LEFT JOIN `TLogindetails` ON `TOrders`.`user` = `TLogindetails`.`user`
    LEFT JOIN `TLogindetails` as `author` ON `author`.`user` = `TOrders`.`author`
    
    WHERE  `TOrders`.`time` >= '1001322000' AND  `TOrders`.`time` <= '1401872400' 
    AND ( 
    IF(`TOrders`.`author` = 0,
    `TLogindetails`.`name` LIKE '%Иванов%' OR `TLogindetails`.`firstname` LIKE '%Иванов%' OR `TLogindetails`.`secondname` LIKE '%Иванов%' OR `TLogindetails`.`in_fio` LIKE '%Иванов%', 
    `author`.`name` LIKE '%Иванов%' OR `author`.`firstname` LIKE '%Иванов%' OR `author`.`secondname` LIKE '%Иванов%' OR `author`.`in_fio` LIKE '%Иванов%'
    )  OR  IF(`TOrders`.`author` = 0,
    	`TLogindetails`.`name` LIKE '%Иван%' OR `TLogindetails`.`firstname` LIKE '%Иван%' OR `TLogindetails`.`secondname` LIKE '%Иван%' OR `TLogindetails`.`in_fio` LIKE '%Иван%', 
    	`author`.`name` LIKE '%Иван%' OR `author`.`firstname` LIKE '%Иван%' OR `author`.`secondname` LIKE '%Иван%' OR `author`.`in_fio` LIKE '%Иван%'
    	)  OR  IF(`TOrders`.`author` = 0,
    		`TLogindetails`.`name` LIKE '%Иванович%' OR `TLogindetails`.`firstname` LIKE '%Иванович%' OR `TLogindetails`.`secondname` LIKE '%Иванович%' OR `TLogindetails`.`in_fio` LIKE '%Иванович%', 
    		`author`.`name` LIKE '%Иванович%' OR `author`.`firstname` LIKE '%Иванович%' OR `author`.`secondname` LIKE '%Иванович%' OR `author`.`in_fio` LIKE '%Иванович%'
    		) 
    	)  
    AND ( `TLogindetails`.`name` LIKE '%Тестовый%' OR `TLogindetails`.`firstname` LIKE '%Тестовый%' OR `TLogindetails`.`secondname` LIKE '%Тестовый%' 
    OR `TLogindetails`.`in_fio` LIKE '%Тестовый%'  OR  `TLogindetails`.`name` LIKE '%физ%' OR `TLogindetails`.`firstname` LIKE '%физ%' OR `TLogindetails`.`secondname` LIKE '%физ%' 
    OR `TLogindetails`.`in_fio` LIKE '%физ%'  OR  `TLogindetails`.`name` LIKE '%лицо%' OR `TLogindetails`.`firstname` LIKE '%лицо%' OR `TLogindetails`.`secondname` LIKE '%лицо%' 
    OR `TLogindetails`.`in_fio` LIKE '%лицо%' )  
    AND  `TOrders`.`paid` >= `TOrders`.`summ` AND  `TOrders`.`status` = 10 
    
    ORDER BY `time` DESC
    LIMIT 0, 20

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

    Запостил: Mayhemalexf, 04 Июня 2014

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

    • Формализация физ.\юр. лица на высшем уровне, да.

      > LIKE...OR....LIKE...OR...LIKE...OR...LIK E
      Фу-фу-фу.
      А потом рассказывают, что запросы тормозят и единственное спасение - какой-нибудь сторонний фулл-текст сирёч движок.
      Ответить
      • > Фу-фу-фу.
        Одного like '%das%' вполне достаточно для лагов ;) А остальная пачка должна довольно шустро отработать - запись же уже в памяти.
        Ответить
        • Неа :)
          Каждый LIKE через OR - это новый фул-тейбл скан ;)
          Хотя, СУБД может и заоптимайзит всё в один скан. Но приятного мало.
          Ответить
          • Т.е. субд почти всегда цепочку or'ов превращают в union? Забавно...
            Ответить
            • слабо верится
              в этом треде не хватает пруфов с explain plan
              Ответить
              • Ну я пару лет назад сталкивался с подобным преобразованием. Там СУБД переписала селект с "или" как объединение двух поисков по индексу. И я тогда удивился этому красивому и быстрому плану.

                А вот разбивать фуллскан на несколько - что-то сомнительно... хотя всякое бывает.
                Ответить
                • кучку or-ов иногда можно распараллелить, в несколько потоков сканируя табличку (даже в памяти), но в условиях поиска должны быть не %иванов%, а доступное по индексу например.
                  Ответить
    • Ну хоть что-то из этого Иванович.
      Ответить

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