выборка по SET полю... по нескольким значениям...

ilal

Новичок
mysql 4.1.16

PHP:
$query = "
     CREATE TABLE `hot_vac` (
     `id` INT( 16 ) UNSIGNED DEFAULT '0' NOT NULL ,
     `id_us` INT( 16 ) UNSIGNED DEFAULT '0' NOT NULL ,
     `data` CHAR( 10 ) DEFAULT '00-00-0000' NOT NULL ,
     `data_fin` INT( 16 ) UNSIGNED DEFAULT '0' NOT NULL ,
     `name` VARCHAR( 255 ),     
     `town_p` SET('1','2','3','4','5','6','7','8','9','10','11',
 '12','13','14', '15','16','17','18','19','20','21','22','23','24',
 '25','26','27','28','29','30','31','32','33','34','35','36','37','38', 
'39','40','41','42','43','44','45','46','47','48','49',
'50','51','52','53','54','55','56','57') ,
     `works` ENUM('1','2','3','4','5','6','7','8','9', 
'10','11','12','13','14','15','16','17','18','19','20',
 '21','22','23','24','25','26','27','28','29','30','31','32',
 '33','34','35','36','37','38','39') ,
      PRIMARY KEY (`id`),
      INDEX(`town_p`),
      INDEX(`id_us`), 
      INDEX(`data_fin`)       
     )";
     $result = mysql_query($query,$conn);
вот такая вот табличка...

у вас что? это дело работает, как вы описываете????
 

ilal

Новичок
так....

SELECT FIND_IN_SET(table.field_name, '10,20,30');

у меня это будет SELECT FIND_IN_SET(hot_vac.town_p, '10,20,30');

а сравнивать с чем?

-~{}~ 12.03.08 01:31:

все, видимо... все спать легли...
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
ilal
в каждом поле hot_vac.town_p таблицы
указанные значения 10 . 20 . 30

-~{}~ 12.03.08 00:52:

или у тебя в строке таблицыгорода указываются как 1,2,3,4,5,6 о_О?
 

Beavis

Banned
мне кажется, или ты связь many-to-many хочешь реализовать с помощью таких ухищрений?
 

ilal

Новичок
или у тебя в строке таблицыгорода указываются как 1,2,3,4,5,6 о_О?

да, именно так... это же поле SET....

что за "many-to-many" ????

-~{}~ 12.03.08 09:21:

пока ничего не понял... точнее, все понял, но пользы от этого пока ноль...

-~{}~ 12.03.08 11:42:

господа, ещё мысли есть?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Извини совсем провтыкал, что у тебя SET поле.
Соответсвенно запрос для поля с типом SET у тебя правильный. Я невнимательно прочитал твой вопрос.

Группа FIND_IN_SET() по каждому значению, что "приходят" в запрос.
Другого выхода я не вижу.

-~{}~ 12.03.08 12:49:

2. LIKE
 

ilal

Новичок
ааааа... я вообще сделал предварительную выборку, поле works только одно значение содержит, а потом просто по массиву пробежался по полученному :

$ty=array_intersect($mas_mas2[$i],$to_hot);

два массива- один строка результата, другой- маска для town_p...

в $ty остались элементы- есть совпадение...

что то мне кажется, что так быстрее будет, чем базу постоянно дергать...

блин, делается то для ерунды... а столько гемора...

ну, а там массивы дальше... на них я если не собаку сьел, то щена точно... :)))

-~{}~ 12.03.08 14:08:

всем спасибо!!! поразвлекались :)))

-~{}~ 12.03.08 14:10:

ладно... в 5 строк все решилось, по идее... или в 15, не суть важно... просто теперь знаю, что средствами базы такое просто так не сделать... секс и труд все перетрут :)))
 

Sluggard

Новичок
FIND_IN_SET
Обратить внимание на:
This function does not work properly if the first argument contains a comma (“,”) character.
-~{}~ 12.03.08 17:37:

ilal
возможно и так решить
PHP:
$to_hot_str = 'FIND_IN_SET("' . implode('", town_p) OR FIND_IN_SET("', $to_hot) . '", town_p)';
+ GROUP BY
но ИМХО, если не поздно, следует задуматься о изменении структуры БД, чтобы избавиться от следующих граблей.
 

ilal

Новичок
думал уже... изменение структуры, конечно, дело хорошее... но... в данной таблице, я думаю, записей будет не много, несколько сотен... а изменения приведут к увеличению таблицы или созданию дополнительных таблиц... что не есть гуд, я думаю... кроме того, по прошлому опыту предпочитаю выдергивать как можно больше из базы... а потом уже средствами пхп все курочить...
 

berkut

Новичок
предпочитаю выдергивать как можно больше из базы... а потом уже средствами пхп все курочить..
а нафига тогда тебе база? храни в файлах, чтобы бд не дёргать
 

Sluggard

Новичок
а изменения приведут к увеличению таблицы или созданию дополнительных таблиц...
скорее ко второму. причем только одной.
что не есть гуд
как-раз гуд. Если бюджет/время не ограничивают.
что то мне кажется, что так быстрее будет, чем базу постоянно дергать...
А ты проверь. И базу ни к чему постоянно дергать. Тебе же уже подсказали, как сделать одним запросом.
 

ilal

Новичок
скорее ко второму. причем только одной.
так... а можно поподробнее? достаточно слабо в базах разбираюсь, да и просто не вижу выхода... как это дело можно на две таблицы раздербанить, чтоб удобнее было?

-~{}~ 13.03.08 16:54:

изменить не поздно, был бы смысл... блин... смысл есть, это точно... но как? хм...
 

Sluggard

Новичок
Поле town_p убрать. Создать таблицу town_p_table с полями hot_vac_id, town_p_num. А по нормальному и города следовало бы вынести в таблицу_справочник.
 

ilal

Новичок
Поле town_p убрать. Создать таблицу town_p_table с полями hot_vac_id, town_p_num. А по нормальному и города следовало бы вынести в таблицу_справочник.
ага... а потом одним запросом по двум таблицам искать? так?
надо будет завтра попробовать... самому уже не нравиться, что сделал... гибкости никакой... :(
 
Сверху