Быстрый переход |
|
Программирование PHP, Perl, HTML, XHTML, CSS, JavaScript, MySQL и другие языки кодирования. |
|
Опции темы |
Сегодня | |||||
|
12.01.2009, 16:04 | #21 | |||
Реноме:
78
|
А придется понять с третье таблицей. Извини но если работаешь с базами данных, то понятия "нормализация" и "третья нормальная" форма придется понять. Чтобы проще приведу конкретный пример, который привожу всем начинающим програмерам. Представь что у тебя есть Книги и Авторы. Книги хранятся в таблице books с полями id_book, name_book. Авторы в таблице Authors - id_author, name_author. Теперь что такое нормализация. Если у каждой книге может быть только один автор, то достаточно в таблицу books добавить поле id_author связанное с полем id_author в таблице Authors. Такое сочетание называется отношение один-ко многим (у одного автора несколько книг - каждая книга принадлежит одному автору). А вот если у тебя книгу могут писать несколько авторов, то это уже называется отношение многих ко многим (у каждого автора несколько книг - каждая книга может принадлежать нескольким авторам). В этом случае применяется нормализация - добавляется третья таблицу books_authors, имеющая два поля id_book, id_author. И теперь Можно записывать так:
Books 1 Визит к минотавру Authors 1 А.Вайнер 2 Г.Вайнер Books_Authors 1 1 1 2 |
|||
12.01.2009, 16:14 | #22 | |||
Предыдущий ник: cmxstudio
Реноме:
561
|
Тут либо делаете таблицу-связку:
`data_id` - INT
`cat_id` - INT `cat_id` - CHAR (255)
__________________
Пользуюсь хостингом |
|||
12.01.2009, 16:41 | #23 | |||
|
Aldes, спасибо за такое "разжеванное" обьяснение, я впринцыпи понял , но вот проблема в том , что понял теоретически , немогу представить как выглядит на практике допустим выборка всех материалов категории ...
И добавляете туда id категорий через запятую ("1,2,3,10,20"). Но я бы не рекомендовал этот способ, так как трудно обрабатывать данные, трудно удалять категории, да и количество категорий ограничено и больше места занимает.
добавлено через 16 минут Вот у меня есть материал и добавлен в 2 категории id которых = 10 - фантастика и 1 - Блокбастеры Но вот когда я захожу на содержимое категорий, этого фильма там нет ... возможно я неправильно извлекаю данные (но если одно число - всё извлекается нормально) ... Последний раз редактировалось botaniQQQ; 12.01.2009 в 16:57. Причина: Добавлено сообщение |
|||
12.01.2009, 17:38 | #24 | |||
Предыдущий ник: faruma
Реноме:
4178
|
Чем не устраивает -
PHP код:
Вот пример с одной таблицей, где выбираем нужную категорию по ID - PHP код:
Код:
CREATE TABLE `news` ( `id` int(11) NOT NULL auto_increment, `post` text NOT NULL, `category_id` varchar(10) default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ; INSERT INTO `news` VALUES (1, 'Пост 1', '1,2'); INSERT INTO `news` VALUES (2, 'Пост 2', '2'); INSERT INTO `news` VALUES (3, 'Пост 3', '1'); INSERT INTO `news` VALUES (4, 'Пост 4', '2'); INSERT INTO `news` VALUES (5, 'Пост 5', '1'); INSERT INTO `news` VALUES (6, 'Пост 6', '2'); |
|||
12.01.2009, 19:03 | #25 | |||
Реноме:
78
|
Еще раз повторяю никаких через запятую. Три таблицы. Возвращаясь к моему варианту с книгами и авторами чтобы получить всех авторов книги под номером один делаете запрос по двум таблицам - таблице авторов и таблице связке SELECT Authors.* FROM Authors INNER JOIN Books_Authors ON Authors.id_author = Books_Authors.id_author WHERE Books_Authors.id_book = 1
Что означает получить всех авторов из таблицы авторов, которые связаны с книгой под номером один. Есть еще что-то непонятное? Хотите найти все книги принадлежащие и нескольким авторам скажем 1 и 2 автору делаете SELECT Books.* FROM Books INNER JOIN Books_Authors ON Books.id_book = Books_Authors.id_book WHERE Books_Authors.id_author IN (1,2) GROUP BY Books.id - групировка нужна чтобы не было задвоений книг если она принадлежит и 1 и 2 автору. regexp - это плохое решение. тяжелое и ограничивает вас в возможностях. представьте чтобы хотите удалить автора из базы (ошиблись и хотите убрать все что с ним связано). в моем случае один DELETE из таблицы Books_Authors. А если через запятую, то помрете вычищать. Последний раз редактировалось Aldes; 12.01.2009 в 19:06. |
|||
12.01.2009, 20:10 | #26 | |||
|
faruma - спасибо огромное теперь всё предельно понятно ...
Aldes - спасибо что отговариваете и по Вашему опыту я пологаю говорите , что лучше ... Я раньше не встречался с INNER JOIN ... Я так понял он выполняет функцию присоединения главной таблицы тоесть data с 3-й дополнительной ... не могли бы Вы немного рассказать о нём ... я нашёл материал Например начало : Выбрать все поля из таблицы Books , с таблицы Books , а дальше ... SELECT Books.* FROM Books INNER JOIN Books_Authors ON Books.id_book = Books_Authors.id_book WHERE Books_Authors.id_author IN (1,2) GROUP BY Books.id добавлено через 1 час 56 минут Да и ещё один вопросик , вот здесь делаем дополнительную 3-ю таблицу если нужно обьединить 2-е (данные и категории) , а если ситуация такова, что нужно обьединить 3 таблицы (данные, категории и год) как тогда быть, лучше обьединять пооддельности данные-категория и данные-год или же одну дополнительную таблицу обьединения данные-категория-год ? Последний раз редактировалось botaniQQQ; 12.01.2009 в 22:06. Причина: Добавлено сообщение |
|||
13.01.2009, 03:59 | #27 | |||
|
Aldes, Вы немного не верно поняли сути вопроса...
Сейчас я попробую растолковать, чего добивается автор 1. Имеем таблицу с новостями (id, text, category). 2. Имеем таблицу с категориями (catid, name) При добавлении новости, в поле category вписуются выбранные категории. И тут вопрос, как сделать, чтобы вписались эти выбранные категории, используя select (но никак не чекбоксы). К примеру, мы это сделали, вписали эти категории. Дальше идет вывод самой новости на главной странице. Нам нужно выбрать эти категории из таблицы новостей поля category и разбить их на отдельные id категории (1,2,3,4,5 и т.п.), и каждой присвоить имя из таблицы категорий поля name. При выводе должно получится <a href="http://site/?category=2/">Боевик</a> С тремя таблицами такого никогда не сделать. С ними можно только вывести список новостей по определенной категории. |
|||
13.01.2009, 11:18 | #28 | |||
Реноме:
78
|
С тремя таблицами все можно сделать. К сожалению не зная как работать с запросами по нескольким таблицам у вас и возникают проблемы. Извините, но дальше не смогу рассказать. Повторю только что подход с полем category - не верен!!!! Делайте третью таблицу. Создавайте новость, связывайте через третью таблциу с категориями. И когда получаете новость делайте еще один запрос чтобы получить список категорий к которым она привязана. Как его сделать смотрите мой пример получения всех авторов книги. Просто сопоставьте книги - это новости, категории - это авторы. Сорри дальше писать не буду. Всетаки это был маленький вопрос
|
|||
14.01.2009, 02:02 | #29 | |||
Реноме:
927
|
OMG, чем дальше в лес, тем больше дров...
Выбираем категории для новости с id=1: 1 вариант: 2 таблицы Код:
CREATE TABLE `news` ( `id` int(11) unsigned NOT NULL auto_increment, `text` varchar(255) NOT NULL, `categories` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251; CREATE TABLE `categories` ( `id` int(11) unsigned NOT NULL auto_increment, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251; Код:
SELECT CONCAT("<a href=\"http://site/?category=",c.id,"\">",c.name,"</a>") as "links" FROM news as n LEFT JOIN categories as c ON FIND_IN_SET(c.id, n.categories)>0 WHERE n.id = 1; Добавим еще одну: Код:
CREATE TABLE `news_categories` ( `news_id` int(11) unsigned NOT NULL, `cat_id` int(11) unsigned NOT NULL, KEY `news_id` (`news_id`), KEY `cat_id` (`cat_id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251; Код:
SELECT CONCAT("<a href=\"http://site/?category=",c.id,"\">",c.name,"</a>") as "links" FROM news_categories as nc LEFT JOIN categories as c ON c.id=nc.cat_id WHERE nc.news_id = 1; Кому как, но по-моему второй запрос гараздо красивее и понятнее, и очевидно что сработать он может быстрее, т.к. не требуется использование дополнительной функции FIND_IN_SET() Чего там еще нельзя сделать с тремя таблицами?
__________________
Регистрация доменов |
|||
14.01.2009, 02:03 | #30 | |||
|
При всем моем уважении, но это является не верным решением и трудоемким в плане обработки (я о 3 таблицах). Куда проще занесети данные нужных категорий в одну таблицу, а затем при выводе их обрабатывать. Делается это достаточно просто: с помощью implode мы объединяем данные в строку и заносим в БД. А на выходе с помощью explode обрабатываем эти категории (присваиваем имена им т.п.). Именно это и рекомендуют разработчики php, а не заморочки с 3 таблицами.
Даже с 3 таблицами обработать данные на выходе - это трудоемкий процесс для php и mysql. Порой бывает что-то посложнее нужно сделать, не создавать же 4-5 таблиц? А кому нужно много времени на обработку? |
|||
Реклама | |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|