У меня есть 2 таблицы. Таблица 1 - «статьи», а Таблица 2 - «article_categories». Когда пользователь создает статью, она сохраняется в «статьях». Пользователь при создании статьи может выбирать различные категории, под которыми может появиться эта статья. В настоящее время статья может быть выбрана в 10-25 категориях (может быть увеличена в будущем). Эти категории, под которыми подана статья, хранятся в «article_categories». Таким образом, это означает, что один идентификатор статьи может иметь несколько связанных значений в таблице article_categories. При извлечении всех значений из обеих таблиц мне нужно было бы извлечь все значения из article_categories и сохранить их в массиве.
Мой вопрос о том, какой SQL-запрос использовать для этого? Должен ли я использовать Inner Join, Left Join, Outer Join ...? Каков был бы лучший способ сделать это? Я попробовал некоторые из этих объединений в phpmyadmin, и они дают мне повторяющиеся значения одной и той же статьи, когда на самом деле статья должна быть выбрана только один раз, и все связанные категории должны быть выбраны. Я хотел сделать все это в одном и том же запросе, не разбивая запрос на 2 разных, чтобы выполнить это. Я прикрепляю свои структуры таблиц, чтобы вам было легко:
CREATE TABLE IF NOT EXISTS `articles` (
`article_id` int(11) unsigned NOT NULL auto_increment,
`creator_id` int(11) unsigned NOT NULL,
`article_title` varchar(150) NOT NULL,
`article_status` varchar(10) NOT NULL,
PRIMARY KEY (`article_id`),
KEY `buyer_id` (`creator_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
--
-- Dumping data for table `articles`
--
INSERT INTO `articles` (`article_id`, `creator_id`, `article_title`, `article_status`) VALUES
(1, 1, 'My article 1', 'Pending');
CREATE TABLE IF NOT EXISTS `article_categories` (
`article_id` int(11) unsigned NOT NULL,
`category_id` smallint(3) unsigned NOT NULL,
PRIMARY KEY (`article_id`,`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `article_categories`
--
INSERT INTO `article_categories` (`article_id`, `category_id`) VALUES
(1, 1),
(1, 2),
(1, 3),
(1, 4),
(1, 5),
(1, 36),
(1, 71);
Также обратите внимание, что у меня есть составной ключ для ключей article_id и category_id в таблице article_categories. Пример запроса, который я использовал ниже:
SELECT *
FROM articles, article_categories
WHERE articles.article_id = article_categories.article_id
AND articles.article_id = 1;
В результате:
article_id creator_id article_title article_status article_id category_id
1 1 My article 1 Pending 1 1
1 1 My article 1 Pending 1 2
1 1 My article 1 Pending 1 3
1 1 My article 1 Pending 1 4
1 1 My article 1 Pending 1 5
1 1 My article 1 Pending 1 36
1 1 My article 1 Pending 1 71
Как видно, значение из таблицы статей повторяется, и оно также может получить все категории (это последний столбец, если форматирование испорчено). Я хотел получить значения из таблицы статей только один раз и получить category_id в цикле, чтобы я мог добавить эти циклические значения в массив и продолжить свою обработку. Вот что я собираюсь сделать после получения значений сверху:
<?php
//i wanted to check if the article_id exists before i pull the related categories.
//If I do it this way and output using mysql_num_rows, it gives me value 7,
//when in fact, the there's only 1 article with such Id. This means it also counts
// the number of categories. Is there a way to uniquely identify only the number of
// articles (just to see if it exists or not, in the place)
$result = mysql_query("SELECT *
FROM articles, article_categories
WHERE articles.article_id = article_categories.article_id
AND articles.article_id = 1");
while ( $rows = mysql_fetch_array($result) )
{ //i don't think this the following 2 assignments should be done in the loop
$article_id = $rows['article_id'];
$article_title = $rows['article_title'];
//(loop all the category_id from the 2nd table and add to the array below)
$categories_id[] .= ??????? --> How do i do this?
}
?>
Очевидно, что я не могу выполнить ПРЕДЕЛ 1 на вышеуказанном, поскольку это ограничит мою способность извлекать все идентификаторы категории.
Так что мой вопрос заключается в том, как мне получить все category_id из 2-й таблицы (в цикле) и добавить их в массив, и в то же время убедиться, что значения из таблицы 1 выбраны только один раз (я Вы понимаете, что значения, извлеченные из таблицы 1, одинаковы, но нет смысла зацикливаться на них). Чтобы добиться этого, я хотел бы получить ваше мнение о том, какой тип соединения я должен использовать для выполнения запроса с максимальной эффективностью и использования минимальных ресурсов, все в одном запросе, чтобы минимизировать попадания в БД. Я надеюсь, что это имеет смысл.
Заранее спасибо.