|
|
|
| У меня страны записаны в столбце countries в виде "1,5,50" (идентификаторы стран). Но дело в том, что если администратор пускает поиск по странам 1,3,5 - то он и должен найти только такие страны... А страну 50, например, найти не должен... Как такой поиск сделать? Видимо, нужно как-то создать условие, что от запрощенной цифры в округе, могут быть только или пробелы, изи запятые... Как? | |
|
|
|
|
|
|
|
для: Shorr Kan
(28.04.2005 в 00:51)
| | Попробовал
WHERE countries LIKE '$country[id],%' OR countries LIKE '%,$country[id],%' OR countries LIKE '%,$country[id]'
|
Он отозвался не слишком лестно. | |
|
|
|
|
|
|
|
для: Shorr Kan
(28.04.2005 в 05:13)
| | REGEXP '^2{1}'
Правильно? В таком случае он должен найти только двоечку, а 162 не найдет?
Расшифруйте, пожалуйста, что я умудрился угадать? (минут 10 набирал случайные символы...) | |
|
|
|
|
|
|
|
для: Shorr Kan
(28.04.2005 в 06:49)
| | Нет, все-таки не получается... WHERE countries REGEXP '^$country[id]{1}' - тут что-то неверно.
$country[id] - это номер страны... получаемый из цикла while... id - это идентификатор страны, country - массив строки из таблички со странами.
Так как же этот поиск сделать? | |
|
|
|
|
|
|
|
для: Shorr Kan
(28.04.2005 в 00:51)
| | Хм... так ведь долго будет происходить поиск в строках, особенно с регулярными выражениями. У вас в системе сколько стран? Все, если меньше 64 здесь удобно воспользоваться типом SET - он обозначает отдельные значения каждым битом и поиск происходит очень быстро.
А так лучше нормализовать таблицу (разбить), т.е. не хранить страны в виде строки "1,5,50", а создать ещё одну таблицу user_countries, состоящую из трёх столбцов
id_user_country - первичный ключ таблицы
id_country - уникальный номер страны
id_user - уникальный номер пользователя
Тогда искать страну будет гораздо проще, пусть даже при помощи многотабличного запроса. | |
|
|
|
|
|
|
|
для: cheops
(28.04.2005 в 13:22)
| | Мне пока не приходит в голову, как это будет работать... Видите ли, если реклама. Она подается в энные страны. Есть пользователи - они из... тоже энных стран. И? Мне нужно организовать функцию, которая бы максимально быстро искала готовую рекламу из таблички А (там есть как раз этот столбец, со странами, в виде 1,2,64...), выбирала бы пользователя из таблички Б, причем пользователя, который подходит под эту страну, проверяла, есть ли соответствующая запись в табличке С (уже высланная конкретная реклама, конкретному пользователю)... и если не выслана, то добавляла эту запись...
Собственно, что-то такое. И вот как тут переиначить работу на ваш вариант - я не очень понимаю.. Да и вообще - как-то скрипуче это все реализовывается у меня... Но тем не менее, задача именно такая - выбрать рекламу (ORDER BY время_отсылки ASC), выбрать пользователей из другой таблички, которым не послана эта реклама (а это отражено в третьей табличке), и послать им эту самую рекламу. | |
|
|
|
|
|
|
|
для: Shorr Kan
(29.04.2005 в 09:33)
| | А не могли бы вы выложить структуру таблиц и кусочек данных (хорошо бы если это был дамп готовый для установки в MySQL), чтобы я сориентировался как лучше запрос составить.
PS Если не хотите светить базу данных в форуме, можете выслать мне её почтой. | |
|
|
|
|
|
|
|
для: cheops
(29.04.2005 в 12:44)
| | Откровенно говоря, я не в курсе как дампы делать :) Но я вам пошлю инсталляционный файл, там все create table
Осталось только сообразить, где ваш мейл найти... | |
|
|
|
|
|
|
|
для: Shorr Kan
(29.04.2005 в 13:28)
| | А, нашел. Посылаю. | |
|
|
|
|
|
|
|
для: Shorr Kan
(29.04.2005 в 13:29)
| | Я вот что предлагаю у таблиц с юзерами и рекламой убрать поле countries, а в системе создать таблицы
CREATE TABLE country_user (
id int(11) NOT NULL auto_increment,
id_country int(11) NOT NULL default '0',
id_user int(11) NOT NULL default '0',
PRIMARY KEY (id)
) TYPE=MyISAM;
|
и
CREATE TABLE country_reklam (
id int(11) NOT NULL auto_increment,
id_country int(11) NOT NULL default '0',
id_reklam int(11) NOT NULL default '0',
PRIMARY KEY (id)
) TYPE=MyISAM;
|
В первой хранятся принадлежность пользователей к странам, а во второй принадлежность рекламы к странам. Структура у обоих таблиц одинакова.
id - первичный ключ
id_country - вторичный ключ для таблицы servit_ptr_country
id_user - вторичный ключ для таблицы servit_ptr_user
id_reklam - вторичный ключ для таблицы servit_ptr_ptsu_reklam
Допустим добавляется пользователь id_user = 1 со странами 1,3,15 - в таблицу country_user пошли три записи
добавляется второй пользователь id_user=2 со странами 4,10,12,50 - в таблицу country_user пошли три записи
4 4 2
5 10 2
6 12 2
7 50 2
|
так же со странами.
А теперь хочет допустим администратор найти пользователей со странами 4,7,9 - можно воспользоваться скриптом
SELECT * FROM country_user, servit_ptr_user
WHERE country_user.id_country IN (4,7,9) AND
country_user.id_user = servit_ptr_user.id
GROUP BY servit_ptr_user.id
|
А захотел рекламу для этих стран запросить
SELECT * FROM country_reklam, servit_ptr_ptsu_reklam
WHERE country_reklam.id_country IN (4,7,9) AND
country_reklam.id_user = servit_ptr_ptsu_reklam .id
GROUP BY servit_ptr_ptsu_reklam.id
|
Теперь остаётся инфу из первого запроса отослать тем, кто получен во втором. | |
|
|
|
|
|
|
|
для: cheops
(30.04.2005 в 00:27)
| | Так... перевариваю... Думаю... | |
|
|
|
|
|
|
|
для: Shorr Kan
(30.04.2005 в 02:31)
| | Что-то начинает получаться, но появилась следующая проблема... Если админ выбирает условие поиска OR, и указывает рекламодателя в одном поле, и страну в другом... То одна и та же реклама появляется дважды - один раз по условию рекламодатель=айди рекламодателя, а второй раз - аналогично, но по стране. Делать проверку в это условие перед этим - очень мучительно - у меня-то условие получилось создать еле-еле. Нельзя ли как-то в запрос distinct или что-то подобное засунуть, чтобы не дублировалась реклама?
Еще пример подобной несуразности - у меня запрос получается такой:
SELECT * FROM tbl WHERE id_country='2' OR id_country='3' OR id_country='4' OR id_country='5' OR id_country='6';
|
Все бы ничего, но есть реклама, например, у которой id_country - И 2, И 4 - и она опять же, дважды появляется...
Итак... Возможно ли как-то в mysql_query это сделать? Или мне нужно мучить это условие до него?
Я имею ввиду, что-то вроде SELECT * FROM tbl WHERE $uslovie AND DISTINCT id
Я понимаю, конечно, что distinct должен быть у select, а не после where... Но я говорю об идее. | |
|
|
|
|
|
|
|
для: Shorr Kan
(30.04.2005 в 06:12)
| | Хммм... Кажется, у меня сработал
<?
SELECT distinct id_reklam,pid FROM
?>
|
Вот уж не думал, что так можно.... Это правильно? Мне нужно получать уникальные id_reklam, но не только этот столбец (а я думал, что distinct можно только в запросе с одним столбцом) | |
|
|
|
|
|
|
|
для: Shorr Kan
(30.04.2005 в 07:28)
| | Да можно так, а ещё часто прибегают к группировке при помощи GROUP BY id_reklam в конце запроса. | |
|
|
|