Помогите с запросом поиска чисел

masters

Новичок
Помогите с запросом поиска чисел

Есть таблица, в 2х полях которой числа через запятую. Эти числа - нумерация строк из другой таблицы.
Например:
поле country="7,4,55,15,49,,,,,,"
Мне надо найти строки, в которых в поле country есть число 5. Если делаю запрос: ... WHERE country="%5%" - он мне выдаст строки где есть 25, 152, 15 и т.д. т.е. везде где встречается число 5. Можно как-то сделать, чтобы он сравнивал числа только между запятыми???
 

masters

Новичок
Так как в примере не получится, одна строка таблицы весит около 2-3 МБ, я просто убью сервер, ведь повторять ее придется как минимум по 15-20 раз...
Разве что вариант, создать еще 2 таблицы, в которых связывать эти 3... Слишком много кода понадобится.
Нашел вариант что если отбирать так: WHERE country="5,%" or country="%,5" or country="%,5,%"

Как такой вариант???
 

prolis

Новичок
Без вариантов.
Напиши на php цикл от 1 до количества стран, в котором отберёшь id из этой таблицы с idcountry и вставишь запись в новую таблицу. 15 минут всех дел.
 

masters

Новичок
Автор оригинала: prolis
Без вариантов.
Напиши на php цикл от 1 до количества стран, в котором отберёшь id из этой таблицы с idcountry и вставишь запись в новую таблицу. 15 минут всех дел.
Ничего подобного, данная конструкция отлично работает: WHERE country LIKE "5,%" or country LIKE "%,5" or country LIKE "%,5,%"

Ввел страны 5, 15, 55, 25 - отобрало без ошибок.
 

Dovg

Продвинутый новичок
>Ничего подобного, данная конструкция отлично работает
это не нужно.

Нужна нормализация.
 

iceman

говнокодер
masters
ты скорее убьешь сервер своей денормализацией и тупыми запросами к бд...

> одна строка таблицы весит около 2-3 МБ,
тебе говорят идентификаторы из "горизонтальной плоскости" разложить в "вертикальную", и еще почитать книжки, статейки и мануал по SQL
 

masters

Новичок
Автор оригинала: iceman
тебе говорят идентификаторы из "горизонтальной плоскости" разложить в "вертикальную", и еще почитать книжки, статейки и мануал по SQL
Вы наверно меня не поняли. Скрипт для сайта турагенства.
Есть 3 таблицы:
список стран - country (num, name), список видов туров - type (num, name), список туров (num, name, type, country, text ...).
Один тур может проходить по нескольким странам (до 10) и принадлежать к разным видам (до 3х).

Мои варианты:

1) разложить туры в "вертикальную плоскость" (как сказал iceman). Т.е. в таблице "список туров" каждую строку повторять столько раз, в скольки она странах и типах присутствует. Следовательно обьем моей базы может увеличится в 3(типы)*10(страны)=30 раз. Если сейчас она весит 480Мб, то я получу 30*480=14.4Гб. Да этот вариант действительно намного лучше :D

2) создать еще 2 таблицы: "сопоставление туров и типов" и "сопоставление туров и стран". Намного экономичней в обьеме, но прожорливей в ресурсах. При каждом запросе мне надо обрабатывать 3 таблицы. При этом php кода прибавится в разы: ведь добавлять, редактировать и удалять придется сразу в 3х таблицах ...

3) вариант, к которому я был склонен, пока не придумал свой: создать в таблице "список туров" столько столбцов, сколько стран и туров, и при поиске их все проверять. Удобно, находит данные в один проход - но по количеству кода всетаки уступает моему варианту, очень большие запросы нужно делать...

И вчем я не прав? Мой вариант находит данные в 1 проход, при этом, на PHP кода всего в пару строк. Весь скрипт редактирования у меня весит всего 6кб. Я не спорю, что это не универсально, но большего функционала мне не нужно.
 

prolis

Новичок
Автор оригинала: masters
2) создать еще 2 таблицы: "сопоставление туров и типов" и "сопоставление туров и стран". Намного экономичней в обьеме, но прожорливей в ресурсах. При каждом запросе мне надо обрабатывать 3 таблицы. При этом php кода прибавится в разы: ведь добавлять, редактировать и удалять придется сразу в 3х таблицах ...
При каждом запросе СЕРВЕРУ надо будет обращаться к трем таблицам - это нормально для сервера БД, он для этого и создан. Редактировать, удалять и добавлять придется конечно, но раз ты с одной таблицей в пару строк укладываешься (на 6Кб:), то шесть срок проект не утяжелят
 

Sender

Новичок
1. http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_find-in-set

2. послушай умных людей, избавляйся от такой структуры БД

3. послушай умных людей, избавляйся от такой структуры БД

4. послушай умных людей, избавляйся от такой структуры БД

5. послушай умных людей, избавляйся от такой структуры БД
 

iceman

говнокодер
masters
ты не прав в том что ты делаешь не правильно, говнокод называют говнокодом потому что он работает, иначе бы этого понятия небыло....

http://ru.wikipedia.org/wiki/Нормальная_форма

и скачай какой-нибудь ERWin и там рисуй, наглядней, понятнее...

так же почитай про SQL: JOIN, FOREIGN KEY

-~{}~ 06.07.10 12:58:

Sender
ой зря наверно ты ему помог есть суп вилкой )
 

Вурдалак

Продвинутый новичок
Автор оригинала: masters
Ничего подобного, данная конструкция отлично работает: WHERE country LIKE "5,%" or country LIKE "%,5" or country LIKE "%,5,%"

Ввел страны 5, 15, 55, 25 - отобрало без ошибок.
— замечательно. Так и оставь, лучше придумать нельзя.
 
Сверху