Показать правильные категории для блогов - PullRequest
0 голосов
/ 24 октября 2011

Я пытаюсь получить все категории о конкретном посте блога, но он не будет работать так, как я хотел, чтобы он работал. Ниже вы можете увидеть SQL и код. $blog получить информацию о конкретном посте блога.

CREATE TABLE IF NOT EXISTS `blogposts` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `id_user_created` int(10) DEFAULT '0',
  `id_user_edited` int(10) DEFAULT '0',
  `post_subject` varchar(100) NOT NULL,
  `post_message` text NOT NULL,
  `post_categories` text NOT NULL,
  `date_published` datetime NOT NULL,
  `date_edited` datetime NOT NULL,
  `info_ipaddress_created` text NOT NULL,
  `info_ipaddress_edited` text NOT NULL,
  `is_shared` enum('0','1') DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
)


CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `id_user` int(10) DEFAULT '0',
  `post_name` text NOT NULL,
  `date_added` datetime NOT NULL,
  `date_edited` datetime NOT NULL,
  `info_ipaddress` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
)


$get_categories = "SELECT * FROM blogposts, categories
                   WHERE blogposts.id = '".(int)$blog['id']."'
                   AND blogposts.post_categories = categories.id
                  ";

foreach($sql->query($get_categories) AS $category) {
    echo '<a href="'.url('blog/category/'.$category['post_name']).'" class="grey-link">';
        echo $category['post_name'];
    echo '</a>';
}


INSERT INTO blogposts` (id, id_user_created, id_user_edited, post_subject, post_message, post_categories, date_published, date_edited, info_ipaddress_created, info_ipaddress_edited, is_shared)
VALUES (1, 1, 1, 'test', 'testar', '1', '', '', '', '', '0'),
(2, 1, 1, 'med kategorier', 'wiho!', '1|2', '', '', '', '', '0');

INSERT INTO categories` (id, id_user, post_name, date_added, date_edited, info_ipaddress)
VALUES (1, 1, 'test', '', '', ''),
(2, 1, 'test2', '', '', '');

Прямо сейчас это только отпечатки Categorized in test, на обоих постах, которые я опубликовал. Он должен распечатать Categorized in test для первого поста и Categorized in test, test2 для второго поста. post_categories выглядит следующим образом: 1 | 2, который является идентификатором для конкретной категории.

Заранее спасибо.

1 Ответ

1 голос
/ 24 октября 2011

Если я посмотрю на вашу таблицу 'blogposts', ваше поле 'post_categories' будет иметь тип text.Я не знаю, что там, но я могу представить, что это строка с идентификатором, разделенным каким-то символом, например точкой с запятой.Этот подход ограничивает гибкость ваших респондентов.Тебе было бы лучше, создав таблицу ссылок.Это означает, что вы вводите новую таблицу, которая отвечает за связь между постом блога и его категориями.Выглядит примерно так:

CREATE TABLE IF NOT EXISTS `blogposts` ( 
  `id` int(10) NOT NULL AUTO_INCREMENT, 
  `post_message` text NOT NULL,
  PRIMARY KEY (`id`), 
  UNIQUE KEY `id` (`id`) 
) 

CREATE TABLE IF NOT EXISTS `categories` ( 
  `id` int(10) NOT NULL AUTO_INCREMENT, 
  `category_name` text NOT NULL, 
  PRIMARY KEY (`id`), 
  UNIQUE KEY `id` (`id`) 
) 

CREATE TABLE IF NOT EXISTS `post_categories` ( 
  `post_id` int(10) NOT NULL AUTO_INCREMENT, 
  `category_id` text NOT NULL
) 

Эта последняя таблица может использоваться для получения всех категорий, которые идут с постом в блоге.Вы можете запросить его, используя JOIN, например:

SELECT * 
FROM blogposts b
INNER JOIN post_categories pc ON pc.post_id=p.id
INNER JOIN categories c ON c.id=pc.category_id
WHERE b.id=<yourvariable>

У вас будет список с большим количеством дубликатов, но каждая строка предназначена для другой категории, которую вы можете использовать для отображения где-либо или для любой другой цели.ты с этим.Может быть, лучше разделить это на два запроса, которые:получить пост с идентификатором у вас есть и б.получить категории, которые идут с постом в блоге, используя таблицу ссылок.

...