2010-07-14 4 views
0

어떤 종류의 참여와 관련하여 도움이 필요합니다. 그걸 알아 내려고.이 테이블에 합류하는 방법을 알아 내십시오

게시판을 정리하고 싶지만 last_postlast_posterid을 게시물에서 가져오고 last_posterid 사용자 이름을 사용하십시오. (: P)을 :

이 아직 얼마나 멀리 왔는지입니다

SELECT name, desc, position FROM boards b 
INNER JOIN posts p ON ??? 
INNER JOIN users u ON ??? 
ORDER BY b.position ASC 

도움이 크게 감상 할 수있다.

건배

CREATE TABLE `posts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`posterid` int(10) unsigned NOT NULL DEFAULT '0', 
`subject` varchar(255) DEFAULT NULL, 
`message` text, 
`posted` int(10) unsigned NOT NULL DEFAULT '0', 
`edited` int(10) unsigned DEFAULT NULL, 
`edited_by` int(10) unsigned NOT NULL DEFAULT '0', 
`icon` varchar(255) DEFAULT NULL, 
`topicid` int(10) unsigned NOT NULL DEFAULT '0', 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 

CREATE TABLE `boards` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
`name` varchar(200) NOT NULL, 
`desc` varchar(255) NOT NULL, 
`position` int(10) NOT NULL DEFAULT '0', 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 

CREATE TABLE `users` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
`username` varchar(200) NOT NULL, 
`password` varchar(255) NOT NULL, 
`salt` varchar(255) NOT NULL, 
`email` varchar(255) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 

CREATE TABLE `topics` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`posterid` int(10) unsigned NOT NULL DEFAULT '0', 
`subject` varchar(255) NOT NULL, 
`posted` int(10) unsigned NOT NULL DEFAULT '0', 
`last_post` int(10) unsigned NOT NULL DEFAULT '0', 
`last_poster` int(10) unsigned NOT NULL DEFAULT '0', 
`num_views` mediumint(8) unsigned NOT NULL DEFAULT '0', 
`num_replies` mediumint(8) unsigned NOT NULL DEFAULT '0', 
`closed` tinyint(1) NOT NULL DEFAULT '0', 
`sticky` tinyint(1) NOT NULL DEFAULT '0', 
`icon` varchar(40) DEFAULT NULL, 
`boardid` int(10) unsigned NOT NULL DEFAULT '0', 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 
+0

스키마가 있습니까? –

+1

나는 ** 매우 ** 능동적 인 상상력을 가지고 있지만 상상력만으로는 달성 할 수있는 것에 한계가 있습니다. 테이블의 구조를 보여주는 것은 어떻습니까? SHOW CREATE TABLE table_name의 출력을 사용하는 것이 바람직합니다. –

+0

죄송합니다, 지금 그것을 추가했습니다. – Richard

답변

0

것도 눈에 띄는, 그래서이 대부분 추측이다 : 당신이 선택 중첩 사용할 수처럼

SELECT b.name, b.desc, b.position 
FROM boards AS b 
INNER JOIN posts AS p 
    ON b.id = p.topicid 
INNER JOIN users AS u 
    ON p.posterid = u.id 
ORDER BY b.position ASC 
0

좋아, 스키마는 견딜 수없는 부족, 그것은 보인다. 같은 뭔가 :

DECLARE @posts TABLE 
(
    postdate datetime, 
    postid int, 
    boardid int 
) 

DECLARE @users TABLE 
(
    userid int, 
    username varchar(10) 
) 

DECLARE @boards TABLE 
(
    boardid int 
) 


INSERT INTO @boards(boardid) VALUES (1) 

INSERT INTO @users (userid, username) values (1, 'Adam') 

insert into @posts (postdate, postid, boardid) values (GETDATE(), 1, 1) 

SELECT b.*, p.* 
from @boards b 
inner join 
(
    SELECT TOP 1 postdate, postid, boardid, username FROM @posts 
    inner join @users on userid = postid WHERE boardid = 1 
    order by postdate desc 
) as p on p.boardid = b.boardid 

는 Oviously이 많이 일반화하고 일부 하드 코딩 된 값을 사용하지만, 희망은 자신의 테이블을 구현하기위한 당신에게 옵션을 제공한다.

은 물론, 내가 사양의 내 구현에 더 정확성을 추론하지 - SQL 내 모국어가 아닌 롤

0
SELECT username, message, posts.id 
FROM users, posts 
WHERE posterid=users.id 
GROUP BY username, message, posts.id 
HAVING posted=MAX(posted) 

이 간결 각 사용자의 마지막 게시물을 얻을 다만 수 있습니다.

2

posts.topicidboards.id을 의미한다고 가정하고, posts.posteridusers.id을 의미

SELECT b.name, d.desc, b.position 
FROM boards b 
LEFT JOIN posts p 
    ON b.id = p.topicid 
LEFT JOIN users u 
    ON (p.posterid = u.id) AND (p.posted = (SELECT MAX(sp.posted) FROM posts sp GROUP BY)) 
ORDER BY 
    b.position ASC 

또 다른 말 같은 것을 시도 :

: 그들이 예를 들어, 참조 분명한 있도록 당신의 필드 이름을하려고
CREATE TABLE `foo` (
    foo_ID UNSIGNED INTEGER NOT NULL AUTO_INCREMENT, 
    -- more stuff 
    PRIMARY KEY (`foo_ID`) 
); 

다른 테이블에서 foo_ID 필드 이름을 다시 사용할 수 있으므로 은 매우 일 때 쉽게 나타납니다. 조인을 수행합니다.

+0

+1 명명 규칙. – Vitaly

0

댓글로 게시하려고했으나 너무 장황하고 지저분했습니다.

    그들에 게시물과 달리 보드는
  1. 그 4 개 테이블이 짐승 될 것입니다 링크 단일 쿼리 표시되지 않기 때문에 외부 조인 사용하는 것이 좋습니다
  2. - 일을 단순화하는 뷰를 사용하여 고려를
  3. 초기 질문과 게시 한 테이블에 약간의 모호함이 남습니다. 주제에 last_post 및 last_poster가 이미 채워져 있습니까? 그렇다면 조인에 대한 주요 목표는 게시판 및 주제가되어야하며 중복 된 데이터를 이미 저장하고 있으므로 (속도는 어떻게됩니까?) last_post_time 또는 기타 항목을 입력하면 작업이 단순 해집니다. 제비와 커브로드 (게시물에 전혀 참여할 필요가 없습니다)?
  4. mediumints? 도대체 왜? (날짜가 필요하지 않고 포장하지 않을 것이라고 생각한다면 나중의 게시물이 자동 증가 키로 인해 더 높은 신분증을 갖게된다는 신뢰의 해킹을 사용할 수 있다고 생각합니다 ...)
관련 문제