#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
Процент в лайке в начале строки - плохая практика, данный запрос не попадет в индекс по полю, потому при росте базы запрос будет лавиннобразно есть все больше памяти и выполняться все медленее.
Комментариев нет:
Отправить комментарий