Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поиск внутри поля
 
 автор: DJ Paltus   (09.09.2009 в 15:12)   письмо автору
 
 

Есть таблица items, в ней текстовое поле kw_id, его значения наподобие "12, 78, 1, 102, 557" с неизвестным числом элементов через запятую.
Есть ли способ выбрать одним запросом записи таблицы, содержащие, скажем, числа 1 и 557 (при этом не зацепив 12 и 102 по признаку наличия в них единицы)?

  Ответить  
 
 автор: cheops   (09.09.2009 в 15:49)   письмо автору
 
   для: DJ Paltus   (09.09.2009 в 15:12)
 

Можно конечно попытаться... но, чтобы получилось быстро и надежно - лучше преобразовать это поле в отдельную таблицу.

  Ответить  
 
 автор: DJ Paltus   (09.09.2009 в 15:54)   письмо автору
 
   для: cheops   (09.09.2009 в 15:49)
 

То есть, выходит, при добавлении записи в эту мою таблицу, надо рисовать для записи персональную таблицу со списком id тэгов? (изумленный смайлик, вопль. wav)

  Ответить  
 
 автор: cheops   (09.09.2009 в 19:19)   письмо автору
 
   для: DJ Paltus   (09.09.2009 в 15:54)
 

Нет, дополнительная таблица будет одна - каждая запись в ней будет соответствовать одной цифре из текстового поля kw_id (разумеется по мимо этих цифр необходимо предусмотреть поле, которое бы связывало цифры с конкретной записью).
1  12 1
2  78 1
3   1 1
4 102 1
5 557 1
6  12 2
7   1 2
8 199 2 

Первое поле - первичный ключ новой таблицы
Второе поле - значение из kw_id
Третье поле - первичный ключ таблицы items, чтобы установить связь между таблицами

  Ответить  
 
 автор: DJ Paltus   (10.09.2009 в 10:25)   письмо автору
 
   для: cheops   (09.09.2009 в 19:19)
 

Огромное спасибо за подсказку. Теперь работаю вот так:


<?
//это после вставки в items:

$item_id=mysql_insert_id();

if(isset(
$_POST['tags'])) {
  foreach(
$_POST['tags'] as $tag){
    
$sql="insert into `links` (`id`, `tag_id`, `item_id`) values ('','$tag', '$item_id')";
    if(!
mysql_query($sql))die(mysql_error()." ".$sql);
    }
  }

else {
  
$sql="insert into `links` (`id`, `tag_id`, `item_id`) values ('','0', '$item_id')";
  if(!
mysql_query($sql))die(mysql_error()." ".$sql);
  }
>?


Я прав?

  Ответить  
 
 автор: Trianon   (10.09.2009 в 10:42)   письмо автору
 
   для: DJ Paltus   (10.09.2009 в 10:25)
 

Ветвь else не нужна вообще.
Апострофы вокруг $item_id не нужны. $item_id уже является целым.
Апострофы вокруг $tag не нужны. $tag должен преобразовываться либо к целому, либо к литеральной строке.
`id` в списке полей указывать не нужно. А если указываете, то в списке значений поля следует ставить не '' а null .
Суррогатный первичный ключ в таблице только мешает. Вместо него просится составной первичный ключ на оба оставшихся поля.

  Ответить  
 
 автор: DJ Paltus   (10.09.2009 в 11:22)   письмо автору
 
   для: Trianon   (10.09.2009 в 10:42)
 

>Суррогатный первичный ключ в таблице только мешает. Вместо него просится составной первичный ключ на оба оставшихся поля.

Не понимаю я этих тонкостей ))
Чему мешает суррогатный? Как делать составной?

  Ответить  
 
 автор: Trianon   (10.09.2009 в 11:28)   письмо автору
 
   для: DJ Paltus   (10.09.2009 в 11:22)
 

CREATE TABLE links(
  tag_id INT(11) NOT NULL, 
  item_id INT(11) NOT NULL, 

  PRIMARY KEY (tag_id, item_id)
);

можно еще добавить индекс UNIQUE (item_id, tag_id) для того, чтобы быстро искать по item_id,
(сортировать по tag_id в пределах конкретного item_id) . Но это уже по желанию.

>Чему мешает суррогатный?
А помогает чему? Его нужно чем-то заполнять, он занимает место, не особо способствуя работе логики. индекс опять же обновлять надо.

  Ответить  
 
 автор: DJ Paltus   (10.09.2009 в 11:42)   письмо автору
 
   для: Trianon   (10.09.2009 в 11:28)
 

А, попонятнее теперь. Так и сделал.
Спасибо )

  Ответить  
 
 автор: heed   (09.09.2009 в 20:13)   письмо автору
 
   для: cheops   (09.09.2009 в 15:49)
 

мне кажется было-бы просще сначала выполнить что-то типа
UPDATE ..... SET `x`=REPLACE(`x`, ' ', '')

и после этого более-менее стабильно всё можно найти
mysql>  SELECT FIND_IN_SET(1, '12,78,1,102,557');
+-----------------------------------+
| FIND_IN_SET(1, '12,78,1,102,557') |
+-----------------------------------+
|                                 3 |
+-----------------------------------+

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования