MySQL Join на две строки - PullRequest
       6

MySQL Join на две строки

0 голосов
/ 15 ноября 2010

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

`articles` (
  `article_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `article_name` varchar(255) NOT NULL
  PRIMARY KEY (`article_id`)
)
`article_categories` (
  `article_id` smallint(5) unsigned NOT NULL,
  `category_id` smallint(5) unsigned NOT NULL
  UNIQUE KEY `article_category_id` (`article_id`,`category_id`),
  KEY `article_id` (`article_id`),
  KEY `category_id` (`category_id`)
)

Теперь я хотел бы получить все статьи, относящиеся к обеим категориям 3 и 5 (или неограниченное количество категорий).).Я думал, что мог бы сделать что-то вроде этого:

SELECT * FROM articles a INNER JOIN article_categories ac ON ac.article_id = a.article_id WHERE (ac.category_id = 3 AND ac.category_id = 5)

Просто чтобы прояснить, я не хочу статьи, которые находятся в ЛИБО 3 или 5, но ОБА 3 И 5.

Ядумая, что это одна из тех действительно простых вещей, которые я как-то упустил из-за усталости или чего-то подобного.

Либо это, либо мне буквально придется сделать еще одно объединение для каждой категории, которую я хочу включить, например:

SELECT a.* FROM articles a INNER JOIN article_categories ac ON ac.article_id = a.article_id INNER JOIN article_categories ac2 ON ac2.article_id = a.article_id WHERE (ac2.category_id = 3 AND ac.category_id = 5)

Но я уверен, что есть более простое решение, чем это.

Ответы [ 3 ]

1 голос
/ 15 ноября 2010

попробуй

select 
  articles.article_id
from 
  articles, 
  article_categories
where 
  articles.article_id=article_categories.article_id and
  article_categories.category_id in(3,5)
group by
  article_categories.article_id
having count(*)>=2;
0 голосов
/ 15 ноября 2010

Другая альтернатива будет:

SELECT article_id FROM (SELECT article_id, count(*) AS cat FROM article_categories WHERE category_id IN (3,5,7)) arts WHERE arts.cat = 3;
0 голосов
/ 15 ноября 2010

1) следующий запрос должен работать (я не проверял его)

select art.*
from
  articles art
  inner join cat1 on cat1.article_id = art.article_id
  inner join cat2 on cat2.article_id = art.article_id
where
  cat1.category_id = 3
  and cat2.category_id = 5

2) Ваша модель данных неверна.У вас должно быть 3 таблицы: aticle, category и aticle_to_category, имена таблиц не должны быть в форме плюрара.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...