0. Создать уникальный ключ по полям (article_id, user_id)
1. Применять
1. Нам не нужно обновлять, а добавлять запись или нет при определенном условии.
2. Повторю, что уникальные ключи отпадают, т.к. значения в полях article_id и user_id могут повторяться, НО не может повторяться комбинация значений этих полей, т.е.
Доброго времени суток! Не то чтобы проблема, но всё же ... Предположим, что пользователь может добавить только один комментарий к каждой статье. В таблице коментариев `comments`, кроме остальных полей, есть поля: `article_id` (ID статьи) и `user_id` (ID юзверя). Если без всяких премудростей, то перед добавлением комментария, можно проверить есть ли хоть одна запись, где присутствует и первый, и воторой параметры сразу.
И если запись не найдена, то даём добро на добавление нового комментария. И вот я задумался, можно ли как-то это выполнять в одном запросе. Т.е. добавлять запись при определенном условии, что-то типа INSERT ... IF([condition]). Применить для данной задачи конструкцию INSERT IGNOR не получится, т.к. поля не могут быть уникальными. Пересмотрел мануалы, но толи пропустил, толи действительно нет такого аналога.
Ну и?
В чём проблема?
У меня запрос, который Вам предложил Выше, работает
Он работает, только по той причине, что заполнена таблица таким образом. Вот простейший случай, где это уже перестанет работать - http://sqlfiddle[dot]com/#!2/b3336/1/0
(!!!Ссылку скопируйте, т.к. парсер форума видать режет её после хеша)
Если б всё так просто было Я может путано объяснил... Попробую так: в данном примере, есть Вася и Петя, у которых по три значения. У Васи есть одно уникальное значение, которое надо вычислить - это "30", а у Пети - есть два уникальных значения, которые так же надо получить - это "30" и "15". То есть, нам без разницы, есть такие же значения у кого-то еще или нет, но важно, чтоб для каждого имени найти его уникальные значения. В итоге, результат выборки именно по этому примеру, должен быть:
В глобальном рассмотрении, тут одно уникальное значение - 15, но в результате запроса, над которым и бьюсь, нам нужно получить уникальное значение val для "Вася" - это 30 и для "Петя" уникальные значения val - 30 и 15. Если наталкнете на то, как лучше составить такой запрос, то буду признателен.
И тем более я не знаю начальной и конечной цели соответственно.
Хотел избежать долгого расписывания задачи и конечно я рассматривал вариан с авторизацией. Увы, но не для себя делаю и это прихоти клиента. Если в двух словах, то ссылку на ресурс, человек получает только после оплаты и заказчик хочет, чтоб данную ссылку нельзя было передать кудато далше, а точнее - воспользоваться с другого компьютера, но так, чтоб со своего email-а человек, оплативший, доступ имел. Он наотрез отказывается от регистраций, да и по сути они не нужны. Я объяснил, что тот же $_SERVER['HTTP_REFERER'] знающий человек может подменить, но он согласен на "защиту от дурака", т.к. в целом, контингент будет малосведущий в области web-разработок.
P.S. Не хочу больше мучать ни вас, ни себя. Так или иначе, но желаемы номер с проверкой почтового ресура не пройдёт. Так что буду искать другие варианты. И спасибо за участие
Скорее не раскрыл суть задачи. Делаю защиту от возможности перенаправления письма с уникальной ссылкой. Знаю, что это не больше, чем "защита от дурака", но вполне устраивает. В базе хранится IP пользователя и почтовый адрес, на который будут отправлятся ссылки. Доступ по ссылке будет ограниченное время и при условии, что совпадает IP пользователя или (вот тут и проблемка), если он открывает ссылки из своего почтового ящика. Т.е. Он может её набрать и руками у себя на машине, открыть у себя же из почтового клиента или сидя на работе, но только из своего почтового ящика. Проверить это, как я понял, увы не получится.
Необходимо сделать следующее: пользователь на сайте указывает свой email > на указанную почту ему высылается ссылка > при первом переходе по ней, надо сохранить адрес страницы, с которой он пришел. $_SERVER['HTTP_REFERER'] - в данном случае не срабатывает. Пропустим варианты, если пользователь вводил адрес ссылки вручную и т.п., но почему не работает даже, если он кликнул на ссылку из тела письма? Возможно есть альтернатива $_SERVER['HTTP_REFERER']?
Страусиная стратегия)
Просто, прежде, чем использовать eval проверьте данные, которые хотите скормить ей ))
Спасибо, успокоили Мне, как новичку, на данном этапе сложно предвидеть разные ситуации, поэтому и подхожу с опаской к определенным методам, если о них не очень хорошо отзываются.
Необходимо вернуть результат.
Руки так и чешутся использовать eval(), но практически на каждом углу говорят, что использование данной функции надо избегать любыми способами. Вот я и задумался над тем, как это можно реализовать "малой кровью". Первое, что пришло в голову - разбить строку по пробелам (они точно присутствуют) и преобразовать строковые значения в число (или число с плавающей точкой). Но как быть со знаками? Можно ли их преобразовать?
Или же я ошибаюсь на счет eval() и его можно использовать, сделав какую-нибудь проверку? Например, так:
Решение довольно-таки лобовое, но вроде будет работать.
Да, вариант интересный. Сейчас несколько раз протестил и вроде, как всё работает, а главное скорость обработки запроса очень радует:
при моих, прости Господи, вложенных селектах, с пятью параметрами - 0.0632 сек., ваш вариант при тех же условиях - 0.0057 сек.
Так что спасибо вам и Panoptik тоже спасибо.
так вы пробовали этот вариант? разве тут выбираются не те, которые вам нужны? (Добавление)
ну вы бы может лучше сразу всё показывали, а не по кускам. может вам посоветовали, более успешный вариант выборки чем СЕЛЕКТ в СЕЛЕКТЕ. ДЖОИНЫ например
Тот вариант я не стал показывать изначально, как отсеянный сразу. На больше моих знаний не хватает. А ваш вариант, я конечно попробовал. Спасибо, но он не работает, как надо.
2 в данном случае - это количество параметров в IN
Дело ведь не в самом ограничении кол-ва записей, а в том, чтоб выбирались только те, которые имеют в разных строках оба параметра (в данном случае). Если придут десять параметров, то соответственно весь десяток. Моих знаний хватает на вариант, который ооочень медленно работает. Это никак не устраивает с учетом того, что записей в таблице будут десятки тысяч.
Мой убогий вариант примерно такой:
SELECT f1 FROMTABLEWHERE f2='A'AND f1 IN(SELECT f1 FROMTABLEWHERE f2='B')
А представьте, что параметров в разы больше? )) Это ж сколько вложений делать?
А уже при пяти вложений, когда я посмотрел время выполнения запроса было такое, что волей не волей вспомнил Dial-UP
MySQL не мой конёк, поэтому даже не знал, как правильно написать заголовок поста... В общем, дело в следующем.
К примеру, есть одна таблица table с двумя полями F1 и F2
Ищем в поле F2, получаем DISTINCT F1. Если параметр один, к примеру А, то на выходе получаем три записи: 7, 12, 5.
Но вот если будет два параметра А и В, то как сделать запрос, чтобы вытащить только две записи 7 и 5. Отсеиваем 12 , т.к. у него параметр В не встречается?
Параметров может быть гораздо больше , чем два.
Так, как строю запрос я - этого естественно достичь нельзя. Всё равно будут выбраны три записи.