![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
KonstRuctor |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 31.3.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: нет |
Работаю с администрированием статей и тегов к ним.
Есть три таблицы: 1) таблица статей articles article_id | head | text | long_text 2) таблица тегов tags tag_id | tag 3) таблица соответствий post_tags id | tag_id | article_id Удаляю статью под номеров $article_id из базы: $result = $db->query("DELETE FROM articles WHERE article_id = '".$article_id."'"); Удаляю из таблицы соответствий $result2 = $db->query("DELETE FROM post_tags WHERE article_id = '".$article_id."'"); В таблице tags остаются "сиротливые" теги, которые могут больше не понадобиться. Но в то же время один из этих тегов может служить тегом к другой статье, его удалять нельзя. Вопрос: оставить "сиротливые" теги болтаться, или как-то организовать их удаление? Если удалять, то после $result2. Как составить такой запрос? |
|||
|
||||
Kirsan |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 4.11.2008 Где: г.Волжский, Волго градская обл. Репутация: нет Всего: 1 |
Если каждая запись в таблице tags сответствует только одной записи из articles, то поможет следующий запрос:
Его нужно выполнять ДО того, как очистите таблицу post_tags, т.е. до $result2. Тогда из таблицы tags будут удалены только те теги, которые относятся к статье с article_id. Если у Вас одна запись из таблицы tags может соответствовать нескольким записям из таблицы articles, то тогда всё несколько сложнее. Это сообщение отредактировал(а) Kirsan - 21.4.2009, 08:45 |
|||
|
||||
lelik133 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 517 Регистрация: 5.2.2003 Где: Москва Репутация: 3 Всего: 14 |
вот пример из мануала http://dev.mysql.com/doc/refman/5.0/en/delete.html
подставьте свои таблицу/столбцы |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
если у тебя при вводе подсказываются возможные значения - однозначно оставить. если у тебя при отсутствии связанных с тегом элементов и при отсутствии самого тега выдается разный контент - лучше оставить(люди уже могли искать что-то по этим тегам). если у тебя "сиротливых" тегов реально много или они "мусорные"(опечатки, ошибки, разные склонения одного слова) лучше удалить. |
|||
|
||||
KonstRuctor |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 31.3.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: нет |
lelik133, Спасибо, покопаюсь!!
skyboy, Я разрабатываю систему, скоро запущу. Хочу сделать по уму. Kirsan, Вы пишите -- Если у Вас одна запись из таблицы tags может соответствовать нескольким записям из таблицы articles, то тогда всё несколько сложнее. На самом деле, как видно из структуры таблиц, tags и articles никак не связаны. На то и создана таблица соответствий post_tags |
|||
|
||||
Kirsan |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 4.11.2008 Где: г.Волжский, Волго градская обл. Репутация: нет Всего: 1 |
Ну так та таблица и есть связь. При взаимоотношении "многое ко многому" такой вариант связи наиболее оптимален.
Приведу два примера: 1) К каждой новой статье теги задаются по новой. Тогда при создании каждой записи в articles у Вас в таблице tags будет создано n записей, привязанных к одной статье. При добавлении следующей статьи, существующие теги не проверяются. Поэтому может быть масса повторений в пределах таблицы tags. И в итоге каждый тег будет соответствовать только одной статье. 2) К каждой новой статье теги задаются на основе уже существующих, но с возможностью добавления новых. Тогда при создании новой записи в таблице articles, в таблице tags будут создаваться только те теги, которых ещё не было, т.е. повторы при нормальной реализации будут исключены. В этом случае у Вас один тег может использоваться в нескольких статьях. Каюсь, не слишком внимательно прочитал первый пост, не заметил, что один тег может использоваться в нескольких статьях. Тот код, что я привёл, подошёл бы в первом случае. А так, если всё же надумаете удалять теги, хотя skyboy предложил варианты поинтереснее, то тогда вам нужно перед тем, как удалять статью, получить все теги, которые с ней связаны, потом убрать из этого списка те, которые ещё остались в таблице соответствий и удалить то, что остплось в списке.
Добавлено через 6 минут и 7 секунд Хм. Почему-то подсветка не хочет работать. Код вроде корректный, у меня редактор нормально кусок подсвечивает. Это сообщение отредактировал(а) Kirsan - 22.4.2009, 01:27 |
|||
|
||||
KonstRuctor |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 31.3.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: нет |
УФФ!!!
Я не додумался до решения с помощью $article_tags = implode(',',$t); Попробуем, попробуем! Да, конечно, каждый раз при добавлении статьи добавляются теги. Автоподставы (словечко еще то ![]() Теоретически в таблице tags должны быть только уникальные теги. Однако Санкт-Петербург и санкт-петербург вроде как два разных тега. Согласен, что автозаполнение поможет решить эту проблему, так как юзер начнет заполнять "сан.." и тут ему — рраз и предложат как грамотно сделать. Спасибо! Вечером буду копаться. О результатах сообщу Это сообщение отредактировал(а) KonstRuctor - 22.4.2009, 16:23 |
|||
|
||||
Kirsan |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 4.11.2008 Где: г.Волжский, Волго градская обл. Репутация: нет Всего: 1 |
Ну теги при добавлении можно и через strtolower() прогонять. Или разбивать на первый символ и всё остальное, первый символ делать большим, а последующие маленькими. В общем сделать так, чтобы добавлялись теги всегда в одном регистре. Тогда часть повторов отпадёт. Главное с кодировками не напутать при преобразовании.
|
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
кривой рог и rhbdjq hju - тоже разные теги, хотя это одно и то же в разных раскладках. и "среда" со "сридой" как бы означают единое. если у тебя теги только для поиска то либо ручная модерация списка(возможно, используя расстояние Левенштейна или soundex для поиска кандидатов в дубликаты), либо забить. если у тебя теги и для SEO(meta name="keywords", например), то варианты с ошибками и не в той раскладке даже круче, чем только один "правильный" вариант. |
|||
|
||||
KonstRuctor |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 31.3.2006 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: нет |
Решение, которое описано в документации MySQL и которое мне предложил lelik133 оказалось очень изящным и красивым. И при этом компактным. Все работает! Теги-сироты удаляются! Отлично.
Буду знать эту технику. |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |