Запрос 2 таблиц в одном запросе - PullRequest
2 голосов
/ 14 ноября 2010

У меня есть таблица для сообщений и таблица для категорий, я хочу выбрать сообщения, которые находятся в определенной категории.Проблема в том, что категория хранится в другой таблице, а не в таблице сообщений, вот пример:

сообщений

id   title       body
---------------------------
125  Some title  Blah blah

категорий

postid  category
----------------
125     politic

Iхотите в одном запросе извлекать сообщения в политическую категорию на примере, что делать?

Ответы [ 3 ]

4 голосов
/ 14 ноября 2010

Использование:

SELECT p.id,
       p.title, 
       p.body
  FROM POSTS p
  JOIN CATEGORIES c ON c.postid = p.id
 WHERE c.category = 'politic'

Проблема, с которой я столкнулся с вашей таблицей CATEGORIES, заключается в том, что сохранение значения категории в виде строки означает, что данные не нормализованы. Вместо этого у вас должна быть таблица CATEGORY:

КАТЕГОРИЯ

  • category_id (первичный ключ, auto_increment)
  • category_description

... и используйте значение category_id в таблице CATEGORIES:

РУБРИКА

  • category_id (первичный ключ, внешний ключ к CATEGORY.category_id)
  • post_id (первичный ключ, внешний ключ для POSTS.postid)
1 голос
/ 14 ноября 2010
select p.* 
from posts p 
inner join categories c 
       on p.id = c.postid 
where 
     c.category = 'politic'
0 голосов
/ 14 ноября 2010

Вам необходимо объединить две таблицы в вашем запросе

SELECT *
FROM posts P
INNER JOIN categories C on C.post_id = P.id
WHERE C.category = 'politic'

Вы можете интуитивно (это не совсем технически правильное объяснение) рассматривать это объединение как добавление поля категории к строке в сообщениях с общим идентификатором (это 'on C.post_id = P.id'). Предложение WHERE указывает, что вам нужны только те строки, в которых категория является «политическим».

Внутреннее соединение - один из нескольких типов соединения. В частности, левое объединение является еще одним распространенным явлением, и его отличие в этой ситуации состоит в том, что строки записей без совпадения по категориям будут по-прежнему перечисляться, но с полями из категорий, равными нулю. (При внутреннем объединении таких строк не осталось бы)

http://en.wikipedia.org/wiki/Join_%28SQL%29

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