Страницы

Поиск по вопросам

вторник, 18 февраля 2020 г.

Сократить количество mysql-кода

#mysql #sql #оптимизация


Можно ли как-нибудь сократить количество mysql-кода в следующем запросе?

SELECT IF(EXISTS(SELECT * FROM tbl WHERE `field_1` LIKE '1'), 
         (SELECT field_3 FROM tbl WHERE `field_1` LIKE '1'), 
         (SELECT field_3 FROM tbl WHERE `field_2` LIKE '1'));

    


Ответы

Ответ 1



Если столбцы field_1 и field_2 не уникальны, то подзапросы, в приведенном вами примере, могут вернуть несколько значений. Сам запрос можно сократить до одной выборки из таблицы, что сократит число обращений к таблице: SELECT field_3 FROM tbl WHERE `field_1` = 1 OR (`field_1` != 1 and `field_2` = 1) ORDER BY `field_1` LIMIT 1; Если field_1 и field_2 уникальны, то сортировка и ограничение числа записей не нужно: SELECT field_3 FROM tbl WHERE `field_1` = 1 OR (`field_1` != 1 and `field_2` = 1);

Ответ 2



Судя по всему, у вас во from другие таблицы, поэтому вы решили использовать подзапросы в select. Можно сделать так при условии, что SELECT field_3 FROM tbl WHERE field_1 LIKE '1' возвращает строго 1 строку всегда: SELECT IFNULL((SELECT field_3 FROM tbl WHERE `field_1` = '1'), (SELECT field_3 FROM tbl WHERE `field_2` = '1')); Не стоит делать like, если нет необходимости, у вас тут строгое сравнение с единичкой.

Ответ 3



Сортируем записи, поднимая вверх те, для которых выполняется первое из нужных вам условий, затем второе, и оставляем самую верхнюю (первую) запись выборки. SELECT field_3 FROM tbl WHERE (field_1 LIKE '1' OR field_2 LIKE '1') ORDER BY field_1 LIKE '1' DESC, field_2 LIKE '1' DESC LIMIT 1

Комментариев нет:

Отправить комментарий