#php #sql
В таблице upload_files содержится путь к фотографиям и текстовым документам. Я делаю выборку для фотографий так: SELECT * FROM `uploаd_files` WHERE name_pos LIKE '%.jpg' OR (`name_pos` LIKE '%.png' OR `name_pos` LIKE '%.gif') AND `ip_users` = '$link' ORDER BY `name_pos` DESC И для документов: SELECT * FROM `upload_files` WHERE name_pos NOT LIKE '%.jpg' OR (`name_pos` NOT LIKE '%.png' OR `name_pos` NOT LIKE '%.gif') AND `ip_users` = '$link' ORDER BY `name_pos` DESC Но результат получается неверный. Что я делаю неправильно?
Ответы
Ответ 1
Ну а для решения проблемы, думаю, надо скобки переставить: SELECT * FROM `uplod_files` WHERE (`name_pos` LIKE '%.jpg' OR `name_pos` LIKE '%.png' OR `name_pos` LIKE '%.gif') AND `ip_users` = '$link' ORDER BY `name_pos` DESC и SELECT * FROM `uplod_files` WHERE NOT (`name_pos` LIKE '%.jpg' OR `name_pos` LIKE '%.png' OR `name_pos` LIKE '%.gif') AND `ip_users` = '$link' ORDER BY `name_pos` DESC И ещё, я бы исправил WHERE следующим образом: WHERE RIGHT(`name_pos`, 3) IN ('jpg', 'png', 'gif') AND `ip_users` = '$link' Ну и соответственно для документов: WHERE NOT RIGHT(`name_pos`, 3) IN ('jpg', 'png', 'gif') AND `ip_users` = '$link'Ответ 2
Вам надо аккуратнее работать со скобками и отрицанием. Если не знаете приоритетов операций, ставьте скобки. Я напишу псевдокод: графика: ((имя похоже на 'А') ИЛИ (имя похоже на 'B') ИЛИ (имя похоже на 'C')) И пользователь такой-то не графика: НЕ ((имя похоже на 'А') ИЛИ (имя похоже на 'B') ИЛИ (имя похоже на 'C')) И пользователь такой-то На самом деле было бы мудрее завести в таблице отдельное поле "mime-type" и проверять его, а не имя файла. Заполнять его один раз при загрузке файла. … WHERE (mime_type LIKE 'image/%')…Ответ 3
Процент в лайке в начале строки - плохая практика, данный запрос не попадет в индекс по полю, потому при росте базы запрос будет лавиннобразно есть все больше памяти и выполняться все медленее.
Комментариев нет:
Отправить комментарий