PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (20): В начало « ... 12 13 14 15 16 [17] 18 19 20 »

> Найдено сообщений: 298
Deonis Отправлено: 23 Ноября, 2012 - 13:26:59 • Тема: INSERT при определенном условии • Форум: SQL и Архитектура БД

Ответов: 9
Просмотров: 96
EuGen пишет:
- в чем трудность создать индекс по двум полям(ровно это и имелось ввиду) сразу?


То есть, когда создаем таблицу, то указываем уникальные ключи как-то так?:

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `comments` (
  2.     `article_id` int(10) NOT NULL,
  3.     `user_id` int(10) NOT NULL,
  4.     /* ... */
  5.     UNIQUE KEY `some_key` (`article_id`, `user_id`)
  6. ) ;


C таким не сталкивался, поэтому поправьте, если не так. И, если можно, то каким запросом можно объединить ключи, если таблица уже создана?
Deonis Отправлено: 23 Ноября, 2012 - 12:56:13 • Тема: INSERT при определенном условии • Форум: SQL и Архитектура БД

Ответов: 9
Просмотров: 96
EuGen пишет:
0. Создать уникальный ключ по полям (article_id, user_id)
1. Применять


1. Нам не нужно обновлять, а добавлять запись или нет при определенном условии.
2. Повторю, что уникальные ключи отпадают, т.к. значения в полях article_id и user_id могут повторяться, НО не может повторяться комбинация значений этих полей, т.е.

CODE (htmlphp):
скопировать код в буфер обмена
  1. article_id = 1 AND  user_id = 1 // юзер добавил комент к первой статье
  2. article_id = 2 AND  user_id = 1 // этот же юзер добавил комент ко второй статье
  3. // Эти комбинации(!), а не значения - уникальны
Deonis Отправлено: 23 Ноября, 2012 - 12:44:23 • Тема: INSERT при определенном условии • Форум: SQL и Архитектура БД

Ответов: 9
Просмотров: 96
Доброго времени суток! Не то чтобы проблема, но всё же ... Предположим, что пользователь может добавить только один комментарий к каждой статье. В таблице коментариев `comments`, кроме остальных полей, есть поля: `article_id` (ID статьи) и `user_id` (ID юзверя). Если без всяких премудростей, то перед добавлением комментария, можно проверить есть ли хоть одна запись, где присутствует и первый, и воторой параметры сразу.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(*) FROM `comments` WHERE `article_id` = '$current_article' AND `user_id` = '$current_user'


И если запись не найдена, то даём добро на добавление нового комментария. И вот я задумался, можно ли как-то это выполнять в одном запросе. Т.е. добавлять запись при определенном условии, что-то типа INSERT ... IF([condition]). Применить для данной задачи конструкцию INSERT IGNOR не получится, т.к. поля не могут быть уникальными. Пересмотрел мануалы, но толи пропустил, толи действительно нет такого аналога.
Deonis Отправлено: 07 Ноября, 2012 - 03:49:06 • Тема: Сложная выборка уникальных значений • Форум: SQL и Архитектура БД

Ответов: 6
Просмотров: 77
armancho7777777 пишет:
Ну и?
В чём проблема?
У меня запрос, который Вам предложил Выше, работает


Он работает, только по той причине, что заполнена таблица таким образом. Вот простейший случай, где это уже перестанет работать - http://sqlfiddle[dot]com/#!2/b3336/1/0
(!!!Ссылку скопируйте, т.к. парсер форума видать режет её после хеша)

UPD

В общем, выход на данный момент нашел следующий:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `name`,`val`, CONCAT(`name`,`val`) AS uv FROM `uniq` GROUP BY uv HAVING COUNT(uv) = 1


В итоге, получаем - http://sqlfiddle[dot]com/#!2/16b7b/1/0
Deonis Отправлено: 07 Ноября, 2012 - 02:53:27 • Тема: Сложная выборка уникальных значений • Форум: SQL и Архитектура БД

Ответов: 6
Просмотров: 77
armancho7777777 пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `val` FROM `table_name` GROUP BY `val` HAVING COUNT(*) = 1
?


Если б всё так просто было Улыбка Я может путано объяснил... Попробую так: в данном примере, есть Вася и Петя, у которых по три значения. У Васи есть одно уникальное значение, которое надо вычислить - это "30", а у Пети - есть два уникальных значения, которые так же надо получить - это "30" и "15". То есть, нам без разницы, есть такие же значения у кого-то еще или нет, но важно, чтоб для каждого имени найти его уникальные значения. В итоге, результат выборки именно по этому примеру, должен быть:

CODE (htmlphp):
скопировать код в буфер обмена
  1. +---------+-------------+
  2. | name    |     val     |
  3. +---------+-------------+
  4. | Вася    |     30      |
  5. | Петя    |     30      |
  6. | Петя    |     15      |
  7. +---------+-------------+
Deonis Отправлено: 07 Ноября, 2012 - 01:22:04 • Тема: Сложная выборка уникальных значений • Форум: SQL и Архитектура БД

Ответов: 6
Просмотров: 77
Здравствуйте! Задача выбрать уникальные значения val для каждой записи name. То есть, к примеру, есть такая таблица:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. +---------+-------------+
  3. | name    |     val     |
  4. +---------+-------------+
  5. | Вася    |     10      |
  6. | Вася    |     30      |
  7. | Вася    |     10      |
  8. | Петя    |     60      |
  9. | Петя    |     60      |
  10. | Петя    |     30      |
  11. | Петя    |     15      |
  12. +---------+-------------+
  13.  


В глобальном рассмотрении, тут одно уникальное значение - 15, но в результате запроса, над которым и бьюсь, нам нужно получить уникальное значение val для "Вася" - это 30 и для "Петя" уникальные значения val - 30 и 15. Если наталкнете на то, как лучше составить такой запрос, то буду признателен.
Deonis Отправлено: 08 Октября, 2012 - 02:46:35 • Тема: HTTP_REFERER не определяется при переходе по ссылке из письма • Форум: Вопросы новичков

Ответов: 4
Просмотров: 267
avtor.fox пишет:
И тем более я не знаю начальной и конечной цели соответственно.

Хотел избежать долгого расписывания задачи и конечно я рассматривал вариан с авторизацией. Увы, но не для себя делаю и это прихоти клиента. Если в двух словах, то ссылку на ресурс, человек получает только после оплаты и заказчик хочет, чтоб данную ссылку нельзя было передать кудато далше, а точнее - воспользоваться с другого компьютера, но так, чтоб со своего email-а человек, оплативший, доступ имел. Он наотрез отказывается от регистраций, да и по сути они не нужны. Я объяснил, что тот же $_SERVER['HTTP_REFERER'] знающий человек может подменить, но он согласен на "защиту от дурака", т.к. в целом, контингент будет малосведущий в области web-разработок.

P.S. Не хочу больше мучать ни вас, ни себя. Так или иначе, но желаемы номер с проверкой почтового ресура не пройдёт. Так что буду искать другие варианты. И спасибо за участие Улыбка
Deonis Отправлено: 07 Октября, 2012 - 19:20:43 • Тема: HTTP_REFERER не определяется при переходе по ссылке из письма • Форум: Вопросы новичков

Ответов: 4
Просмотров: 267
avtor.fox пишет:
Deonis это невозможно логически.

Я предполагал это
avtor.fox пишет:
Но Вы сами себе усложнили задачу.

Скорее не раскрыл суть задачи. Делаю защиту от возможности перенаправления письма с уникальной ссылкой. Знаю, что это не больше, чем "защита от дурака", но вполне устраивает. В базе хранится IP пользователя и почтовый адрес, на который будут отправлятся ссылки. Доступ по ссылке будет ограниченное время и при условии, что совпадает IP пользователя или (вот тут и проблемка), если он открывает ссылки из своего почтового ящика. Т.е. Он может её набрать и руками у себя на машине, открыть у себя же из почтового клиента или сидя на работе, но только из своего почтового ящика. Проверить это, как я понял, увы не получится.

P.S. А это

CODE (html):
скопировать код в буфер обмена
  1. <a href='http://site.com?referer=mailclient'>перейти на сайт</a>


мне не поможет в данной ситуации.
Deonis Отправлено: 07 Октября, 2012 - 12:31:45 • Тема: HTTP_REFERER не определяется при переходе по ссылке из письма • Форум: Вопросы новичков

Ответов: 4
Просмотров: 267
Необходимо сделать следующее: пользователь на сайте указывает свой email > на указанную почту ему высылается ссылка > при первом переходе по ней, надо сохранить адрес страницы, с которой он пришел. $_SERVER['HTTP_REFERER'] - в данном случае не срабатывает. Пропустим варианты, если пользователь вводил адрес ссылки вручную и т.п., но почему не работает даже, если он кликнул на ссылку из тела письма? Возможно есть альтернатива $_SERVER['HTTP_REFERER']?
Deonis Отправлено: 05 Октября, 2012 - 02:41:24 • Тема: Математические выражения, переданные строкой • Форум: JavaScript & VBScript

Ответов: 3
Просмотров: 2261
armancho7777777 пишет:

Страусиная стратегия)
Просто, прежде, чем использовать eval проверьте данные, которые хотите скормить ей ))


Спасибо, успокоили Улыбка Мне, как новичку, на данном этапе сложно предвидеть разные ситуации, поэтому и подхожу с опаской к определенным методам, если о них не очень хорошо отзываются.
Deonis Отправлено: 05 Октября, 2012 - 02:10:34 • Тема: Математические выражения, переданные строкой • Форум: JavaScript & VBScript

Ответов: 3
Просмотров: 2261
Здравствуйте! К примеру, такая задача: есть строка, состоящая из математического выражения:
CODE (javascript):
скопировать код в буфер обмена
  1. var mathStr = '10 + 15 * 2 / 5';

Необходимо вернуть результат.
Руки так и чешутся использовать eval(), но практически на каждом углу говорят, что использование данной функции надо избегать любыми способами. Вот я и задумался над тем, как это можно реализовать "малой кровью". Первое, что пришло в голову - разбить строку по пробелам (они точно присутствуют) и преобразовать строковые значения в число (или число с плавающей точкой). Но как быть со знаками? Можно ли их преобразовать?
Или же я ошибаюсь на счет eval() и его можно использовать, сделав какую-нибудь проверку? Например, так:

CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. var mathStr = '10 + 15 * 2 / 5';
  3. var arr = mathStr.split(' ');
  4. var newArr = [];
  5. for(var i = 0; i < arr.length; i++){
  6.     if(i % 2 == 0){
  7.         newArr.push(parseFloat(arr[i]));
  8.     } else {
  9.         if(arr[i].length == 1 && isNaN(arr[i])){
  10.             newArr.push(arr[i]);
  11.         } else {
  12.             return false;
  13.         }
  14.     }
  15. }
  16. alert(eval(newArr.join('')));
  17.  


P.S. Попадались статьи, аля "Парсер математических выражений", но к сожалению не в области JS
Deonis Отправлено: 06 Апреля, 2012 - 23:25:33 • Тема: MySQL-выборка по двум и более параметрам во многих строках • Форум: Работа с СУБД

Ответов: 6
Просмотров: 4281
Мелкий пишет:
Решение довольно-таки лобовое, но вроде будет работать.

Да, вариант интересный. Сейчас несколько раз протестил и вроде, как всё работает, а главное скорость обработки запроса очень радует:
при моих, прости Господи, вложенных селектах, с пятью параметрами - 0.0632 сек., ваш вариант при тех же условиях - 0.0057 сек.
Так что спасибо вам и Panoptik тоже спасибо.
Deonis Отправлено: 06 Апреля, 2012 - 08:54:45 • Тема: MySQL-выборка по двум и более параметрам во многих строках • Форум: Работа с СУБД

Ответов: 6
Просмотров: 4281
Panoptik пишет:
так вы пробовали этот вариант? разве тут выбираются не те, которые вам нужны?
(Добавление)
ну вы бы может лучше сразу всё показывали, а не по кускам. может вам посоветовали, более успешный вариант выборки чем СЕЛЕКТ в СЕЛЕКТЕ. ДЖОИНЫ например


Тот вариант я не стал показывать изначально, как отсеянный сразу. На больше моих знаний не хватает. А ваш вариант, я конечно попробовал. Спасибо, но он не работает, как надо.
Deonis Отправлено: 06 Апреля, 2012 - 08:41:59 • Тема: MySQL-выборка по двум и более параметрам во многих строках • Форум: Работа с СУБД

Ответов: 6
Просмотров: 4281
Panoptik пишет:
2 в данном случае - это количество параметров в IN

Дело ведь не в самом ограничении кол-ва записей, а в том, чтоб выбирались только те, которые имеют в разных строках оба параметра (в данном случае). Если придут десять параметров, то соответственно весь десяток. Моих знаний хватает на вариант, который ооочень медленно работает. Это никак не устраивает с учетом того, что записей в таблице будут десятки тысяч.
Мой убогий вариант примерно такой:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT f1 FROM TABLE WHERE f2='A' AND f1 IN (SELECT f1 FROM TABLE WHERE f2='B')

А представьте, что параметров в разы больше? )) Это ж сколько вложений делать?
А уже при пяти вложений, когда я посмотрел время выполнения запроса было такое, что волей не волей вспомнил Dial-UP Радость
Deonis Отправлено: 06 Апреля, 2012 - 03:31:30 • Тема: MySQL-выборка по двум и более параметрам во многих строках • Форум: Работа с СУБД

Ответов: 6
Просмотров: 4281
MySQL не мой конёк, поэтому даже не знал, как правильно написать заголовок поста... В общем, дело в следующем.
К примеру, есть одна таблица table с двумя полями F1 и F2

Ищем в поле F2, получаем DISTINCT F1. Если параметр один, к примеру А, то на выходе получаем три записи: 7, 12, 5.
Но вот если будет два параметра А и В, то как сделать запрос, чтобы вытащить только две записи 7 и 5. Отсеиваем 12 , т.к. у него параметр В не встречается?
Параметров может быть гораздо больше , чем два.
Так, как строю запрос я - этого естественно достичь нельзя. Всё равно будут выбраны три записи.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DISTINCT F1 FROM TABLE WHERE F2 IN ('A','B')

Прошу помощи у гуру.

Страниц (20): В начало « ... 12 13 14 15 16 [17] 18 19 20 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB