|
|
|
| Вот встала передо мной задачка.
Делаю систему тегов, пользователь вводит в поле тэги скажем к записи в личном дневнике, через пробел. Я через explode это собираю в массив и вот вопрос...
Я сделал запрос вида:
SELECT `id` FROM `tags`.`tags` WHERE `tag` IN ('слово1','слово2','слово3','слово4','слово5')
|
Но к сожалению если не существует какого-то из слов на него ничего не придет, даже NULL. Я в данном случае придумал только если делать на каждое слово по запросу и если mysql_num_rows == 0 то делать insert слова в базу. Но возможно (не нашел) есть иные более простые решения.
Заранее спасибо. | |
|
|
|
|
|
|
|
для: Proger
(07.09.2008 в 06:36)
| | А какой результат хочется получить от запроса? | |
|
|
|
|
|
|
|
для: Trianon
(07.09.2008 в 14:17)
| | Возможно не правильно написал немного...
Мой результат это получить id существующих слов и id не существующих, соответственно вставив их перед этим.
Были слова
слово1, слово2, слово3 в базе
а слово4 и слово5 не было, мы их должны insert их в базу и их иды узнать
Берём иды всех введённых пользователем слов (то есть слово1, слово2, слово3, слово4, слово5) и их ИДЫ вставляем в другую таблицу соответствие номера записи в дневнике заданному тегу. | |
|
|
|
|
|
|
|
для: Proger
(07.09.2008 в 21:54)
| | >Возможно не правильно написал немного...
Ничего не изменилось. Попробуйте дать прочесть кому-нибудь.
я сильно удивлюсь, если этот кто-то без дополнительных вопросов что-нибудь поймет. | |
|
|
|
|
|
|
|
для: Proger
(07.09.2008 в 21:54)
| | >и id не существующих, соответственно вставив их перед этим.
Интересно id не существующих откуда берутся и куда их вставить перед этим? | |
|
|
|
|
|
|
|
для: AcidTrash
(07.09.2008 в 22:23)
| | В таблицу где все слова... ид = auto_increment какое это имеет отношение к делу? | |
|
|
|
|
|
|
|
для: Proger
(07.09.2008 в 22:35)
| | и их ИДЫ вставляем в другую таблицу
зачем вам ещё одна таблица?
Вобщем я бы передавал эти теги массивом
И в цикле обходил каждый... если в безе есть, то возвращаем АйДи, если нет , то инсёрт и соответствинно ласт АйДи.
только вот непонятно как вы будете проверять тег прислал юзер или лабуду? | |
|
|
|
|
|
|
|
для: Valick
(07.09.2008 в 22:48)
| | тэг это слово! Я имею ввиду не html теги или т.п. а ТЭГИ - как web 2.0 - ключевые слова к информации. Другая таблица нужна....
2 таблицы
Первая: ид ТЭГ
Вторая: ид тэга ид информации по ТЭГу
Ладно понял... так видимо и назревает смотреть каждое слово по отдельности с помощью цикла... | |
|
|
|
|
|
|
|
для: Proger
(07.09.2008 в 23:13)
| | Я имею ввиду на html теги или т.п. а ТЭГИ
Во блин... когда смотрел первый раз тему я думал и о тех и о других тегах.
А сейчас почему-то втемяшились ХТМЛ теги) | |
|
|
|
|
|
|
|
для: Proger
(07.09.2008 в 23:13)
| | Я бы сделал следующий цикл.
1. Получить в $present список имеющихся слов
SELECT id, word FROM tagTable WHERE word in($list)
2. если число строк равно расмеру $list - прекратить цикл.
3. Вычислить разницу между $list и $present в массив $need
4. Сформировать по $need многострочный INSERT IGNORE
5. повторять с п1.
Минимум SQL-операторов. И отсутствие коллизий при одновременном исполнении. | |
|
|
|
|
|
|
|
для: Trianon
(07.09.2008 в 23:30)
| | А чем плох мой алгоритм неподскажите? | |
|
|
|
|
|
|
|
для: Valick
(07.09.2008 в 23:45)
| | А алгоритм-то где?
На самом деле может и ничем неплох.
Поскольку автор информацию о структуре таблиц предоставлять отказывается, оценивать любые алгоритмы - гадание на кофейной гуще. IMHO | |
|
|
|
|
|
|
|
для: Trianon
(07.09.2008 в 23:50)
| | >А алгоритм-то где?
вот: в цикле обходил каждый... если в безе есть, то возвращаем АйДи, если нет , то инсёрт и соответствинно ласт АйДи
В любом случае и в вашем и в моём надо блокировать таблицу, что бы и селект и инсёрт "ехали на одном велосипеде" | |
|
|
|
|
|
|
|
для: Valick
(07.09.2008 в 23:54)
| | >>А алгоритм-то где?
>вот: в цикле обходил каждый... если в безе есть, то возвращаем АйДи, если нет , то инсёрт и соответствинно ласт АйДи
Так число селектов и инсертов в пределе равно числу слов. Это много.
>В любом случае и в вашем и в моём надо блокировать таблицу, что бы и селект и инсёрт "ехали на одном велосипеде"
В моем - блокировать не нужно. В Вашем - не возьмусь определить, но по-моему тоже не нужно. | |
|
|
|
|
|
|
|
для: Trianon
(07.09.2008 в 23:58)
| | В моем - блокировать не нужно. В Вашем - не возьмусь
Ну как же? один юзер хочет добавить теги "кожа" и "рожа" , второй - теги "морда" и "рожа"
практически одновременно и в обоих случаях слова "рожа" пока нет в базе. После инсёрта в базе будут две "рожи" с разными АйДи | |
|
|
|
|
|
|
|
для: Valick
(08.09.2008 в 00:08)
| | >Ну как же? один юзер хочет добавить теги "кожа" и "рожа" , второй - теги "морда" и "рожа"
>практически одновременно и в обоих случаях слова "рожа" пока нет в базе. После инсёрта в базе будут две "рожи" с разными АйДи
На столбце word стоит UNIQUE индекс. INSERT IGNORE добавит только "морду". | |
|
|
|
|
|
|
|
для: Trianon
(08.09.2008 в 00:26)
| | Понятно. Спасибо. | |
|
|
|
|
|
|
|
для: Trianon
(07.09.2008 в 23:58)
| | Так число селектов и инсертов в пределе равно числу слов. Это много
согласен. Просто я пытался сократить промежуток между отдельно взятыми селектом и инсёртом. | |
|
|
|
|
|
|
|
для: Valick
(08.09.2008 в 00:20)
| | >согласен. Просто я пытался сократить промежуток между отдельно взятыми селектом и инсёртом.
А смысл? | |
|
|
|
|
|
|
|
для: Trianon
(08.09.2008 в 00:28)
| | Ну чтоб таблицу блокировать на минимальный промежуток времени.
Да и это уже неважно... ваш алгоритм круче (обещаю не называть его в вашу честь))) ) | |
|
|
|
|
|
|
|
для: Trianon
(07.09.2008 в 23:30)
| | А можно попродробней расписать это?
Просто на слово РОЖА может быть запись с ид 412512 и 3253253 и 45435643, зайдите на любой хабрахабр или бобрдобр и посмотрите как это выглядит.
Структура таблиц:
--
-- База данных: `tags`
--
-- --------------------------------------------------------
--
-- Структура таблицы `forum_tags`
--
CREATE TABLE `forum_tags` (
`tagid` int(10) NOT NULL,
`topicid` int(10) NOT NULL,
KEY `tagid` (`tagid`,`topicid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
--
-- Дамп данных таблицы `forum_tags`
--
-- --------------------------------------------------------
--
-- Структура таблицы `tags`
--
CREATE TABLE `tags` (
`id` int(10) NOT NULL auto_increment,
`tag` varchar(25) NOT NULL,
KEY `id` (`id`,`tag`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=32 ;
--
-- Дамп данных таблицы `tags`
--
INSERT INTO `tags` VALUES(1, 'жопа');
INSERT INTO `tags` VALUES(2, 'привет');
INSERT INTO `tags` VALUES(3, 'проверка');
INSERT INTO `tags` VALUES(4, 'теги');
INSERT INTO `tags` VALUES(5, 'таги');
...
|
| |
|
|
|
|
|
|
|
для: Proger
(08.09.2008 в 00:51)
| | Да и кстати для каждого модуля сайта (конечной информации модуля, например сообщение на форуме или в дневнике) есть свой уникальный ID который я и сопостовляю tag_id, тут я представил пример с forum_tags...
Ну эт так... чтобы было понятней :) | |
|
|
|
|
|
|
|
для: Proger
(08.09.2008 в 00:53)
| |
$tags = explode(" ",$_POST['tags']);
$zap = ", ";
$cnt = $ins = null;
foreach ($tags as $ky) {
if (strlen($ky) <= 2) continue;
$tag[] = $ky;
}
$c = count($tag);
foreach ($tag as $key) {
$cnt++;
if ($c == $cnt) $zap = null;
$ins .= "'$key'".$zap;
}
$q = "SELECT * FROM `tags`.`tags` WHERE tag IN (".$ins.")";
$r = mysql_query($q);
if (count($words) != mysql_num_rows($r)) {
//как вычислить какие именно слова не вставлены? Сравнивать с массивом $words полученные из БД данные?
}
while ($row = mysql_fetch_assoc($r)) {
//insert `tags`.`forum_tags` ...
}
|
Правильно понимаю? и как массивы оптимальней сравнить, подскажите пожалуйста! | |
|
|
|
|
|
|
|
для: Proger
(08.09.2008 в 00:51)
| | >А можно попродробней расписать это?
распишите, конечно.
>Просто на слово РОЖА может быть запись с ид 412512 и 3253253 и 45435643,
слова РОЖА в Вашей таблице нет. Но допустим, если оно есть под id=6, то таблица forum_tags дополнится строками
6,412512
6,3253253
6,45435643
>зайдите на любой хабрахабр или бобрдобр и посмотрите как это выглядит.
мне сказать, куда Вам зайти? | |
|
|
|
|
|
|
|
для: Trianon
(08.09.2008 в 01:01)
| | >>зайдите на любой хабрахабр или бобрдобр и посмотрите как это выглядит.
>мне сказать, куда Вам зайти?
Это было обращение к Valick =)
А что попродробней то расписывать, вроде уже все изложил... | |
|
|
|
|
|
|
|
для: Proger
(08.09.2008 в 01:04)
| | >>>зайдите на любой хабрахабр или бобрдобр и посмотрите как это выглядит.
>>мне сказать, куда Вам зайти?
>Это было обращение к Valick =)
А то я не заметил :))
>А что попродробней то расписывать, вроде уже все изложил...
Вот и я так же мыслю...
PS. Я может какого смутного подтекста не понимаю? | |
|
|
|
|
|
|
|
для: Trianon
(08.09.2008 в 01:10)
| | Мммм... или я засыпаю или кофе был не качественным))
вопрос тут:
if (count($words) != mysql_num_rows($r)) {
//как вычислить какие именно слова не вставлены? Сравнивать с массивом $words полученные из БД данные?
}
|
Вроде более и нет...пока... | |
|
|
|
|
|
|
|
для: Proger
(08.09.2008 в 01:14)
| | см. п.3 алгоритма.
Есть соответствующие функции работы с массивами.
Хотя можно и без них. | |
|
|
|
|
|
|
|
для: Trianon
(08.09.2008 в 01:16)
| | Дык я понял п.3 только вот КАК!? Нужно из всех данных полученных по select сформировать массив $tag_from_db и сравнить (в цикле?) с массивом $tag? Сравнение массивов что-то мне не понятно в данной ситуации...
PS кофе все-таки плохой, туплю :(((( | |
|
|
|
|
|
|
|
для: Trianon
(08.09.2008 в 01:16)
| | Запрс
$query="SELECT id, word FROM tags WHERE word in($list)";
|
у меня не хочет выполнятся, говорит
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in | |
|
|
|
|
|
|
|
для: Valick
(08.09.2008 в 01:33)
| | я бы тоже не захотел на такой запрос отвечать)) (сделайте echo $query)
Нашел супер функцию array_diff =) | |
|
|
|
|
|
|
|
для: Proger
(08.09.2008 в 01:36)
| | Я вообщет пытаюсь набросать код по алгоритму Трианона, а вы чем занимаетесь? | |
|
|
|
|
|
|
|
для: Valick
(08.09.2008 в 01:45)
| | а чего пытацца я его уже почти в полном виде привел в посте выше и сейчас сделаю сравнение массивов, вроде уже готово)) | |
|
|
|
|
|
|
|
для: Proger
(08.09.2008 в 02:01)
| | я тут подумал если INSERT IGNORE добавляет только новые значения, то зачем вообще эти пляски с бубном?
Делаем INSERT IGNORE
А следом селект и всё. | |
|
|
|
|
|
|
|
для: Valick
(08.09.2008 в 02:39)
| | Повторюсь 3 раз))) Кофе был плахой)) Попил чаю понял примерно тоже самое)) Уря! ;) Всем пасиба! | |
|
|
|
|
|
|
|
для: Valick
(08.09.2008 в 02:39)
| | Я хотел вообще избежать тяжелого оператора INSERT IGNORE в ситуации (как я понимаю - довольно частой) когда присутствуют все слова. | |
|
|
|
|
|
|
|
для: Trianon
(08.09.2008 в 08:54)
| | просто интересно неужели INSERT IGNORE намного тяжелее SELECT, как я понимаю и там и там необходимо перелопатить всю таблицу
И вообще если в таблице есть уникальное поле, то я так понимаю нагрузка от INSERT возростает из-за него? | |
|
|
|
|
|
|
|
для: Valick
(08.09.2008 в 09:41)
| | Оператор INSERT "тяжел" хотя бы тем, что это оператор DML а не SQL - он вносит измеения в таблицу, а не читает её.
В ситуации, когда можно обойтись без записи - без нее стоит обойтись. | |
|
|
|
|
|
|
|
для: Trianon
(08.09.2008 в 10:32)
| | По алгоритму да и просто с течением времени скажем в таблице тегов будет 10000 слов, а они все в нижнем регистре, соответственно с чем дальше, тем больше уже слов будет существовать... | |
|
|
|
|
|
|
|
для: Proger
(08.09.2008 в 19:34)
| | Ну как у вас успехи? Можете показать конечный результат? | |
|
|
|
|
|
|
|
для: Valick
(09.09.2008 в 00:59)
| | Успехи вчера были достигнуты ещё в 5 утра, а кода слишком много, это я вопрос насчет одного кусочка задавал, а файлов не менее 10, также html, js, dom, ajaj и т.п. так что... | |
|
|
|
|
|
|
|
для: Proger
(09.09.2008 в 01:42)
| | Я у вас про кусочек и спрашиваю... хочу сравнить ваш с моим | |
|
|
|
|
|
|
|
для: Valick
(09.09.2008 в 01:50)
| | А смысл? =))
ЗЫ: Усё. Тему мона закрывать, а то оффтоп пошел. | |
|
|
|
|
|
|
|
для: Proger
(09.09.2008 в 22:24)
| | >А смысл? =))
Тот же что и у Вас.
>ЗЫ: Усё. Тему мона закрывать, а то оффтоп пошел.
Жадно стало или стыдно? :) | |
|
|
|
|
|
|
|
для: Trianon
(09.09.2008 в 23:32)
| | Пока не закрыли тему вот мой код:
<?php
// *********************************************************
// Функция выборки существующих id из таблицы $table
// если слова нет, то вставляем
// $table - имя таблици
// $field_id - имя колонки id
// $field_word - имя колонки ключевых слов (UNIQUE)
// Функция возвращает массив содержащий id значений из $mass
//**********************************************************
function show_id($table,$field_id,$field_word,$mass)
{
while (isset($mass))
{
// Формируем запрос на выборку из базы слов содержащихся в массиве
$query="SELECT `$field_id`, `$field_word` FROM `$table` WHERE `$field_word` IN('".implode("','",$mass)."')";
$res=mysql_query($query);
while ($present=mysql_fetch_object($res))
{
$id[]=$present->$field_id;
$key=array_search($present->$field_word,$mass);
if(isset($key)) unset($mass[$key]);
}
if(count($mass)==0)
{
unset($mass);
}
else
{
// Формируем многострочный запрос к базе из массива для вставки
$query = "INSERT IGNORE INTO `$table` (`$field_word`) VALUES('".implode("'),('",$mass)."')";
$res=mysql_query($query);
}
}
$id=array_unique($id);
return $id;
}
//**********************************************************
include_once ("conect.php");
$list[]="ноги";
$list[]="теги";
$list[]="жопа";
$list[]="Valick";
$list[]="вставили";
$list[]="жопа";
$list[]="мамонт";
$id=show_id('tags','id','word',$list);
print "<PRE>";
print_r ($id);
print "</PRE>";
?>
|
| |
|
|
|
|
|
|
|
для: Valick
(10.09.2008 в 00:24)
| |
IN('".implode("','",$mass)."')"
|
Вы ж понимаете, что так с текстом нельзя. И почему. :( | |
|
|
|
|
|
|
|
для: Trianon
(10.09.2008 в 00:27)
| | Ещё пока непонимаю... яж не волшебник)
Было бы неплохо если бы вы намекнули, для этого собственно я и выкладывал код.
Если вы имеете ввиду инъекции... то для меня сейчас важны нюансы самого алгоритма... про безопасность речь не идёт | |
|
|
|
|
|
|
|
для: Valick
(10.09.2008 в 00:30)
| | То, что Вы называете инъекциями, я называю некорректной обработкой данных. | |
|
|
|
|
|
|
|
для: Trianon
(10.09.2008 в 00:35)
| | Тоесть функция должна быть самодостаточной, и корректную обработку выносить за её пределы нестоит? Просто я так думаю функций может быть много, а обработать введённые данные (корректно) можно один раз. | |
|
|
|
|
|
|
|
для: Valick
(10.09.2008 в 00:39)
| | корректную обработку данных нельзя вынести или внести.
А экранирование не то что за пределы функции - его от обрамления кавычками не стоит отделять. Потому как кавычки отдельно и экранирование отдельно - смысл теряют. | |
|
|
|
|
|
|
|
для: Trianon
(10.09.2008 в 00:46)
| | Подскажите, что надо поправить? Напишите как должно быть, или хотябы как должен выглядеть "эхо" запроса в данном случае. Спасибо, что хоть как-то наставляете на путь истинный. | |
|
|
|
|
|
|
|
для: Valick
(10.09.2008 в 00:49)
| | Код набросал на одном дыхании, и не проверял.
Ляпов может быть море.
<?
function to_sql($x)
{
return is_array($x) ? ('('. implode(',',array_map('to_sql', $x)).')')
: is_string($x) ? ("'". mysql_escape_string($x)."'")
: is_numeric() ? $x;
}
function show_id($table,$field_id,$field_word,$mass)
{
for(;;)
{
$sql = "SELECT `$field_id` AS fi, `$field_word` AS fw FROM `$table` WHERE fw IN ". to_sql($mass);
if(!($res=mysql_query($sql))) exit("Error in $sql : " .mysql_error());
for($list = array(); $row = mysql_fetch_assoc($res); $list[$row['fw']] = intval($row['fi'])) ;
if(count($list) == $count($mass)) return $list;
$sql = "INSERT IGNORE INTO `$table` (`$field_word`) VALUES " . to_sql(array_diff($mass, array_keys($list)))
if(!($res=mysql_query($sql))) exit("Error in $sql : " .mysql_error());
if(!mysql_affected_rows()) exit("Error in $sql : no rows added");
}
}
|
| |
|
|
|
|
|
|
|
для: Trianon
(10.09.2008 в 01:11)
| | Почитал:
<?php
function show_id($table,$field_id,$field_word,$mass)
{
// зачем этот цикл?
for(;
{
// зачем выносить запрос в отдельную переменную? чтобы выполнить лишний оператор присваивания?
$sql = "SELECT `$field_id` AS fi, `$field_word` AS fw FROM `$table` WHERE fw IN ". to_sql($mass);
if(!($res=mysql_query($sql))) exit("Error in $sql : " .mysql_error());
// сдесь в этом варианте нужно сделать отступ, чтоб читать было легче
for($list = array(); $row = mysql_fetch_assoc($res); $list[$row['fw']] = intval($row['fi'])) ;
// если перенес на другую строку, то будь добр увелич отступ, т.к. этот иф лежит внутри фора
if(count($list) == $count($mass)) return $list;
// опять используем лишнюю переменную
$sql = "INSERT IGNORE INTO `$table` (`$field_word`) VALUES " . to_sql(array_diff($mass, array_keys($list)))
// нет слов...
if(!($res=mysql_query($sql))) exit("Error in $sql : " .mysql_error());
// нет слов...
if(!mysql_affected_rows()) exit("Error in $sql : no rows added");
} // конец ненужного цикла
}
|
Зачем нам return $list если в случае, когда нуно что-либо добавить мы ничего не возващаем абсолюнто.
Убрал лишний мусор, продумал возврат значенй:
если ничего добавлять не надо, то функция вернет 2.
добавили что-то = 1
ошибка = 0
вот что получилось:
<?php
function show_id($table,$field_id,$field_word,$mass)
{
if($res=mysql_query("SELECT `$field_id` AS fi, `$field_word` AS fw FROM `$table` WHERE fw IN ". to_sql($mass)) )
{
for($list = array(); $row = mysql_fetch_assoc($res); $list[$row['fw']] = intval($row['fi']));
if(count($list) == $count($mass))
return 2
if( mysql_query("INSERT IGNORE INTO `$table` (`$field_word`) VALUES " . to_sql(array_diff($mass, array_keys($list)))) ) return 1; else return 0;
} else return 0;
}
|
зы: то, что внутри текста запроса я не читал, просто скопировал. проверь скобки и запятые, чтоб на месте были | |
|
|
|
|
|
|
|
для: Ocelot
(11.09.2008 в 00:59)
| | Вы не ознакомились с заданием. Функция (код) должна возвращать АйДи строк содержащихся в массиве (если строки нет в базе, то вставить её и вернуть её АйДи). В принципе мой код (см выше) рабочий (упс... нашёл ещё огрех ... вобщем-то и есть куда совершенствовать код), только осталось сделать её "всеядной"
I 100% know why O"Relly & partners doesn't eat Mc'donalds Gamburgers\Cheeseburgers
| "скормить" пока не смог)) (хотя толком ещё и не пробовал)
Появилась мысль ограничиться одним селектом (без цикла)... сёдня спать, а завтра буду думать. | |
|
|
|
|
|
|
|
для: Valick
(11.09.2008 в 01:06)
| | Скормить "это" в задачи функции не входило даже. Я потому свой код и не привел ибо у нас как я понимаю конечные задачи координально различатся!
Ocelot - немного не понятно что же выйдет на результат, но код по быстродействую выигрывает. Только не понимаю чей алгоритм он реализует...
ЗЫ опять кофе плохой... | |
|
|
|
|
|
|
|
для: Proger
(11.09.2008 в 01:21)
| | Суть в разделении на 2 функции.
1) добавляет значения
2) берет их id
напр. при сохранении тегов (если мы не выводим список тегов пользователю) нам не нужно получать его из базы.
При подготовке можно просто получать список тегов уже имеющихся в базе, не занося новые (показать пользователю, что уже есть и сколько экземпляров чего-то помечено этим тегом).
Итого: пока редактируем у нас будет 5-10 селект запросов (смотря сколько раз юзер правил список и как часто мы обновляем его) и один инсерт при сохранении. | |
|
|
|
|
|
|
|
для: Valick
(11.09.2008 в 01:06)
| | вместо возврата 2 вернем на место $лист
и цикл... только ИМХО он тут не есть лучшее решение | |
|
|
|
|
|
|
|
для: Ocelot
(11.09.2008 в 00:59)
| | автор: Ocelot (11.09.2008 в 00:59) письмо автору
2 Трианон: прошу прощеия, на часах 4 часа ночи (по местному)... не доконца понял задачу. | |
|
|
|
|
|
|
|
для: Trianon
(09.09.2008 в 23:32)
| | и не то и не то, просто я не общественный банк кода)) Да и всё равно я чуствую что человек делает иначе, дык мой код с его сравнивать в данном случае глупо. | |
|
|
|
|
|
|
|
для: Proger
(11.09.2008 в 00:24)
| | У вас случайно не двойное гражданство?
Я попросил вас выложить кусочек кода, чтобы я мог посмотреть ход ваших мыслей. Это нужно было лично мне. И я считаю раз уж вы обращаетесь за помощью в данном вопросе, то могли бы ответить взаимностью. Вместо этого вы несёте какую-то чепургу.
Вобщем лично я сделал кое-какие выводы относительно вас. И как любил говаривать В. Стрельников "Доззвиданья"
-2- | |
|
|
|
|
|
|
|
для: Proger
(11.09.2008 в 00:24)
| | >и не то и не то, просто я не общественный банк кода
Ок. Я учту. | |
|
|
|
|
|
|
|
для: Proger
(07.09.2008 в 23:13)
| | Вторая: ид тэга ид информации по ТЭГу
Тем более вам ненужна такая вторая таблица...
Я бы сделал так:
Первая: ид ! ТЭГ ! ид информации по ТЭГу
Вторая: ид информации по ТЭГу ! информация | |
|
|
|