2010-09-08 3 views
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 в таблице комментариев?

ответ

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, здесь: http://stackoverflow.com/questions/565620/difference-between-join-and-inner-join quoting @palehorse: _They функция такая же. INNER JOIN может быть более понятным для чтения, особенно если ваш запрос содержит другие типы соединений (например, LEFT или RIGHT), включенные в него. – aularon

+0

спасибо. я понял :) –

0

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

... FROM comments, news WHERE comments.news_id = news.id ORDER BY ... 
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 ................. 
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; 
Смежные вопросы