Для вступления в общество новичков и профессионалов домен-индустрии, пожалуйста нажмите здесь ...

   
 Купля-продажа и обсуждение доменных имён
        

  
Вернуться   Форум о доменах > Дизайн и развитие проектов > Программирование
Регистрация Реноме Правила форума Справка Сообщество
Программирование PHP, Perl, HTML, XHTML, CSS, JavaScript, MySQL и другие языки кодирования.

Ответ
 
Опции темы
Сегодня
от 149р за .RU
Аренда сервера
2x Intel Hexa-Core Xeon E5-2420
Всего 79 евро!

с видеокартой GeForce GTX 1080 Ti
всего 99 евро!

от 149р за .РФ Реклама на DomenForum.net
Старый 12.01.2009, 16:04   #21
 
Аватар для Aldes
 
Регистрация: 26.07.2006
Сообщений: 115
Доменные сделки: 0
Реноме: 78
Одобрения
Спасибо (Отдано): 0
Спасибо (Получено): 0
А придется понять с третье таблицей. Извини но если работаешь с базами данных, то понятия "нормализация" и "третья нормальная" форма придется понять. Чтобы проще приведу конкретный пример, который привожу всем начинающим програмерам. Представь что у тебя есть Книги и Авторы. Книги хранятся в таблице 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
Aldes вне форума   Ответить с цитированием
Старый 12.01.2009, 16:14   #22
Предыдущий ник: cmxstudio
 
Аватар для Семен
 
Регистрация: 07.04.2008
Сообщений: 2,406
Доменные сделки: 7
Реноме: 561
Одобрения
Спасибо (Отдано): 0
Спасибо (Получено): 0
Отправить сообщение для Семен с помощью ICQ
Тут либо делаете таблицу-связку:
 
`data_id` - INT
`cat_id` - INT
Или добавляете дополнительное поле:
 
`cat_id` - CHAR (255)
И добавляете туда id категорий через запятую ("1,2,3,10,20"). Но я бы не рекомендовал этот способ, так как трудно обрабатывать данные, трудно удалять категории, да и количество категорий ограничено и больше места занимает.
__________________
Пользуюсь хостингом НКВД и спокоен за работу своих сайтов! Например, HardForum.ru.
Семен вне форума   Ответить с цитированием
Старый 12.01.2009, 16:41   #23
 
Аватар для botaniQQQ
 
Регистрация: 20.03.2008
Сообщений: 247
Доменные сделки: 3
Реноме:
Одобрения
Спасибо (Отдано): 0
Спасибо (Получено): 0
Aldes, спасибо за такое "разжеванное" обьяснение, я впринцыпи понял , но вот проблема в том , что понял теоретически , немогу представить как выглядит на практике допустим выборка всех материалов категории ...

 
И добавляете туда id категорий через запятую ("1,2,3,10,20"). Но я бы не рекомендовал этот способ, так как трудно обрабатывать данные, трудно удалять категории, да и количество категорий ограничено и больше места занимает.
Но ведь такой метод используется на cms DLE и как по мне стабильно работает ... Но ведь когда я выбираю данные где категории через запятую , то обычным образом данные не вытягиваются , тоесть в категории с этими id данные не заносятся ...

добавлено через 16 минут
Вот у меня есть материал и добавлен в 2 категории id которых = 10 - фантастика и 1 - Блокбастеры



Но вот когда я захожу на содержимое категорий, этого фильма там нет ... возможно я неправильно извлекаю данные (но если одно число - всё извлекается нормально) ...

Последний раз редактировалось botaniQQQ; 12.01.2009 в 16:57. Причина: Добавлено сообщение
botaniQQQ вне форума   Ответить с цитированием
Старый 12.01.2009, 17:38   #24
Предыдущий ник: faruma
 
Регистрация: 11.11.2007
Сообщений: 3,560
Доменные сделки: 27
Реноме: 4178
Одобрения
Спасибо (Отдано): 12
Спасибо (Получено): 46
Чем не устраивает -
PHP код:
category regexp '[[:<:]](номер категории)[[:>:]]' 
?

Вот пример с одной таблицей, где выбираем нужную категорию по ID -
PHP код:
if (isset($_GET['c'])) {

    
$sql mysql_query("SELECT * FROM news WHERE category_id regexp '[[:<:]](".$_GET['c'].")[[:>:]]' ORDER BY id ASC ");
    
    while (
$row mysql_fetch_assoc($sql)) {
        echo 
$row['post']."<br>";
        }
    } 
таблица -
Код:
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');
Заходишь по ссылке: сайт.ру/?c=1 - где 1 это ID категории.
MASTER вне форума   Ответить с цитированием
Старый 12.01.2009, 19:03   #25
 
Аватар для Aldes
 
Регистрация: 26.07.2006
Сообщений: 115
Доменные сделки: 0
Реноме: 78
Одобрения
Спасибо (Отдано): 0
Спасибо (Получено): 0
Еще раз повторяю никаких через запятую. Три таблицы. Возвращаясь к моему варианту с книгами и авторами чтобы получить всех авторов книги под номером один делаете запрос по двум таблицам - таблице авторов и таблице связке 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.
Aldes вне форума   Ответить с цитированием
Старый 12.01.2009, 20:10   #26
 
Аватар для botaniQQQ
 
Регистрация: 20.03.2008
Сообщений: 247
Доменные сделки: 3
Реноме:
Одобрения
Спасибо (Отдано): 0
Спасибо (Получено): 0
faruma - спасибо огромное теперь всё предельно понятно ...

Aldes - спасибо что отговариваете и по Вашему опыту я пологаю говорите , что лучше ...

Я раньше не встречался с INNER JOIN ...

Я так понял он выполняет функцию присоединения главной таблицы тоесть data с 3-й дополнительной ... не могли бы Вы немного рассказать о нём ... я нашёл материал http://www.javenue.info/post/20 , вот только слабо обьясняется именно INNER JOIN ... именно по второму способу можете проговорить его ...

Например начало : Выбрать все поля из таблицы 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. Причина: Добавлено сообщение
botaniQQQ вне форума   Ответить с цитированием
Старый 13.01.2009, 03:59   #27
 
Регистрация: 13.01.2009
Сообщений: 7
Доменные сделки: 0
Реноме:
Одобрения
Спасибо (Отдано): 0
Спасибо (Получено): 0
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>

С тремя таблицами такого никогда не сделать. С ними можно только вывести список новостей по определенной категории.
Katakikuto вне форума   Ответить с цитированием
Старый 13.01.2009, 11:18   #28
 
Аватар для Aldes
 
Регистрация: 26.07.2006
Сообщений: 115
Доменные сделки: 0
Реноме: 78
Одобрения
Спасибо (Отдано): 0
Спасибо (Получено): 0
С тремя таблицами все можно сделать. К сожалению не зная как работать с запросами по нескольким таблицам у вас и возникают проблемы. Извините, но дальше не смогу рассказать. Повторю только что подход с полем category - не верен!!!! Делайте третью таблицу. Создавайте новость, связывайте через третью таблциу с категориями. И когда получаете новость делайте еще один запрос чтобы получить список категорий к которым она привязана. Как его сделать смотрите мой пример получения всех авторов книги. Просто сопоставьте книги - это новости, категории - это авторы. Сорри дальше писать не буду. Всетаки это был маленький вопрос
Aldes вне форума   Ответить с цитированием
Старый 14.01.2009, 02:02   #29
 
Регистрация: 16.01.2006
Сообщений: 1,137
Доменные сделки: 0
Реноме: 927
Одобрения
Спасибо (Отдано): 0
Спасибо (Получено): 0
Отправить сообщение для X-Ception с помощью ICQ
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;
2 вариант: 3 таблицы
Добавим еще одну:
Код:
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;
тут конечно, как и в первом случае, получилась связка всего из двух таблиц, т.к. id новости был заранее известен, а в других ситуациях просто связываются все три подряд.

Кому как, но по-моему второй запрос гараздо красивее и понятнее, и очевидно что сработать он может быстрее, т.к. не требуется использование дополнительной функции FIND_IN_SET()

Чего там еще нельзя сделать с тремя таблицами?
__________________
WM2Directi.ru - платежные шлюзы для реселлеров доменов | TelePay.com.ua
Регистрация доменов Reg-It.Net
X-Ception вне форума   Ответить с цитированием
Старый 14.01.2009, 02:03   #30
 
Регистрация: 13.01.2009
Сообщений: 7
Доменные сделки: 0
Реноме:
Одобрения
Спасибо (Отдано): 0
Спасибо (Получено): 0
При всем моем уважении, но это является не верным решением и трудоемким в плане обработки (я о 3 таблицах). Куда проще занесети данные нужных категорий в одну таблицу, а затем при выводе их обрабатывать. Делается это достаточно просто: с помощью implode мы объединяем данные в строку и заносим в БД. А на выходе с помощью explode обрабатываем эти категории (присваиваем имена им т.п.). Именно это и рекомендуют разработчики php, а не заморочки с 3 таблицами.
Даже с 3 таблицами обработать данные на выходе - это трудоемкий процесс для php и mysql. Порой бывает что-то посложнее нужно сделать, не создавать же 4-5 таблиц? А кому нужно много времени на обработку?
Katakikuto вне форума   Ответить с цитированием
Ответ



Реклама

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 01:59. Часовой пояс GMT +4.