|
|
|
| Есть таблица items, в ней текстовое поле kw_id, его значения наподобие "12, 78, 1, 102, 557" с неизвестным числом элементов через запятую.
Есть ли способ выбрать одним запросом записи таблицы, содержащие, скажем, числа 1 и 557 (при этом не зацепив 12 и 102 по признаку наличия в них единицы)? | |
|
|
|
|
|
|
|
для: DJ Paltus
(09.09.2009 в 15:12)
| | Можно конечно попытаться... но, чтобы получилось быстро и надежно - лучше преобразовать это поле в отдельную таблицу. | |
|
|
|
|
|
|
|
для: cheops
(09.09.2009 в 15:49)
| | То есть, выходит, при добавлении записи в эту мою таблицу, надо рисовать для записи персональную таблицу со списком id тэгов? (изумленный смайлик, вопль. wav) | |
|
|
|
|
|
|
|
для: 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, чтобы установить связь между таблицами | |
|
|
|
|
|
|
|
для: 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);
}
>?
|
Я прав? | |
|
|
|
|
|
|
|
для: DJ Paltus
(10.09.2009 в 10:25)
| | Ветвь else не нужна вообще.
Апострофы вокруг $item_id не нужны. $item_id уже является целым.
Апострофы вокруг $tag не нужны. $tag должен преобразовываться либо к целому, либо к литеральной строке.
`id` в списке полей указывать не нужно. А если указываете, то в списке значений поля следует ставить не '' а null .
Суррогатный первичный ключ в таблице только мешает. Вместо него просится составной первичный ключ на оба оставшихся поля. | |
|
|
|
|
|
|
|
для: Trianon
(10.09.2009 в 10:42)
| | >Суррогатный первичный ключ в таблице только мешает. Вместо него просится составной первичный ключ на оба оставшихся поля.
Не понимаю я этих тонкостей ))
Чему мешает суррогатный? Как делать составной? | |
|
|
|
|
|
|
|
для: 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) . Но это уже по желанию.
>Чему мешает суррогатный?
А помогает чему? Его нужно чем-то заполнять, он занимает место, не особо способствуя работе логики. индекс опять же обновлять надо. | |
|
|
|
|
|
|
|
для: Trianon
(10.09.2009 в 11:28)
| | А, попонятнее теперь. Так и сделал.
Спасибо ) | |
|
|
|
|
|
|
|
для: 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 |
+-----------------------------------+
|
| |
|
|
|