Как выбрать сущность из другой таблицы?

0

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

Новая таблица,

CREATE TABLE  `news` (
`id` int(20)  NOT NULL auto_increment,
`timestamp` int(20) NOT NULL,
`title` varchar(255) NOT NULL,
`content` text NULL,
`pic_title` varchar(255) NOT NULL,
`pic_brief` varchar(255) NOT NULL,
`pic_detail` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Таблица комментариев

CREATE TABLE `comments` (
`id` int(20) NOT NULL auto_increment,
`timestamp` int(20) NOT NULL,
`title` varchar(255) NOT NULL,
`name` varchar(50) NOT NULL,
`email` varchar(50) NOT NULL,
`phone` int(11) NULL,
`location` varchar(50) NOT NULL,
`comment` text NOT NULL,
`approve` tinyint(1) NOT NULL,
`news_id` int(20) NOT NULL,
PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

в news_id в таблице комментариев я храню идентификатор новостей, я хочу сделать запрос выбора из таблицы комментариев, и он должен выбрать news.title из новостей, ссылающихся на news_id в таблице комментариев,

Я сделал что-то вроде этого.

                $query = "SELECT comments.id,
                 comments.timestamp,
                 comments.name,
                 comments.email,
                 comments.phone,
                 comments.location,
                 comments.comment,
                 news.title FROM 
                 comments, news ORDER BY id DESC LIMIT $from, " . COMM_POST_NUMBER;

как заставить его получать только заголовок из news.title, ссылающийся на идентификатор из news_id в таблице комментариев?

Теги:

4 ответа

1
Лучший ответ

Вам нужно join обе таблицы:

$query = "SELECT comments.id,
         comments.timestamp,
         comments.name,
         comments.email,
         comments.phone,
         comments.location,
         comments.comment,
         news.title
         FROM comments INNER JOIN news ON comments.news_id = news.id
         ORDER BY id DESC LIMIT $from, " . COMM_POST_NUMBER;

Другие обозначения:

FROM comments, news WHERE comments.news_id = news.id

P.S. не забудьте очистить свой вход, не полагайтесь на $from как целое число, заставляйте его целое число:

$from = intval($from);
  • 0
    +1 за то, что я держу код в чистоте, чтобы я мог понять, если бы я мог, я бы дал вам еще +1 за подсказку. я реализовал это. единственная путаница, которую я испытываю, это между INNER JOIN и JOIN ..
  • 0
    @Ibrahim, проверьте здесь: stackoverflow.com/questions/565620/… цитируя @palehorse: они функционируют одинаково. INNER JOIN может быть немного более понятным, особенно если в ваш запрос включены другие типы соединения (например, LEFT или RIGHT).
Показать ещё 1 комментарий
1
$query = 'SELECT comments.*, news.title
            FROM comments
       JOIN LEFT news
              ON news.id = comments.news_id
        ORDER BY id DESC
           LIMIT ' . (int) $from . ', ' . COMM_POST_NUMBER;
0

используя JOIN

SELECT comments.id,
             comments.timestamp,
             comments.name,
             comments.email,
             comments.phone,
             comments.location,
             comments.comment,
             news.title 
FROM 
             comments
join news on news.id=comments.news_id
ORDER BY id DESC 
LIMIT .................
0

Вам нужно предложение where перед ORDER BY:

... FROM comments, news WHERE comments.news_id = news.id ORDER BY ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню