2010-06-28 25 views
2

我遇到SQL查询时遇到问题。连接SQL中的表

SELECT t.topicname, m. *, ms.avatar 
    FROM `messages` m 
    INNER JOIN topics t ON m.topicid = t.topicid 
    inner join users u on m.author=u.username 
    inner join misc ms on u.userid=ms.userid 
    ORDER BY postdate DESC LIMIT 5 

我想要做的就是从主题表topicname,一切从消息表和头像从杂项表

我由topicid加入主题和邮件表 我可以加入通过messages.author和users.username和messgages和用户表加入到其它表上我加入users.userid和misc.userid

问题是我没有得到的结果我想

这q uery适用于加入了邮件和主题表,但我需要添加其它表,只有这样,才能加入该是throught用户表

SELECT t.topicname, m. * 
    FROM `messages` m 
    INNER JOIN topics t ON m.topicid = t.topicid 
    ORDER BY postdate DESC LIMIT 5 

这里是表结构

CREATE TABLE `messages` (
    `messageid` int(6) NOT NULL auto_increment, 
    `boardid` int(2) NOT NULL default '0', 
    `topicid` int(4) NOT NULL default '0', 
    `message` text NOT NULL, 
    `author` varchar(255) NOT NULL default '', 
    `postdate` datetime default NULL, 
    PRIMARY KEY (`messageid`) 
) 

CREATE TABLE `misc` (
    `miscid` int(4) NOT NULL auto_increment, 
    `userid` int(4) NOT NULL default '0', 
    `profpic` varchar(100) NOT NULL default '', 
    `avatar` varchar(100) NOT NULL default '', 
    `signature` text NOT NULL, 
    `alerts` enum('y','n') NOT NULL default 'y', 
    PRIMARY KEY (`miscid`) 
) 

CREATE TABLE `topics` (
    `topicid` int(4) NOT NULL auto_increment, 
    `boardid` int(2) NOT NULL default '0', 
    `topicname` varchar(255) NOT NULL default '', 
    `author` varchar(255) NOT NULL default '', 
    `counter` int(5) NOT NULL default '0', 
    `sticky` char(1) NOT NULL default 'n', 
    `locked` char(1) NOT NULL default 'n', 
    PRIMARY KEY (`topicid`) 
) 

CREATE TABLE `users` (
    `userid` int(25) NOT NULL auto_increment, 
    `first_name` varchar(25) NOT NULL default '', 
    `last_name` varchar(25) NOT NULL default '', 
    `email` varchar(255) NOT NULL default '', 
    `username` varchar(25) NOT NULL default '', 
    PRIMARY KEY (`userid`) 
) 

这是只有2个连接的查询输出,这是我期望得到的(只有我想有一个化身)

它不漂亮,但这是数据库给我的

topicname   messageid  boardid   topicid   message   author  postdate 
Mauris Eu Neque Ipsum 36 4 8 Suspendisse nibh risus, porta at cursus sed, tinci... iTuneStinker 2010-04-08 20:31:39 
Aliquam Erat Volutpat 35 5 15 Donec volutpat ligula eu lorem pharetra a adipisci... AwsomeMoon 2010-04-07 21:58:20 
Ut Non Risus Elit 34 2 14 Etiam cursus, erat sed placerat fringilla, risus a... ScaryHair 2010-04-07 15:35:34 
Quisque Rutrum Mattis Sagittis 33 5 9 Etiam in elit sit amet nulla scelerisque ultricies... ScaryHair 2010-04-07 15:33:46 
Where Do I Start Trying To Organise A Festival 32 3 12 Morbi a neque aliquam nisl varius lobortis. Sed ve... ScaryHair 2010-04-07 13:27:40 

,这里是使用该连接的所有表的查询结果

topicname   messageid  boardid   topicid   message   author  postdate  avatar 
Forum Rules And Guidelines 2 1 1 FORUM RULES  AdRock 2009-04-11 23:05:18  avatar_17200.jpg 
Forum Rules And Guidelines 3 2 2 FORUM RULES. AdRock 2009-04-11 23:05:18  avatar_17200.jpg 
Forum Rules And Guidelines 4 3 3 FORUM RULES  AdRock 2009-04-11 23:05:18  avatar_17200.jpg 
Forum Rules And Guidelines 5 4 4 FORUM RULES  AdRock 2009-04-11 23:05:18  avatar_17200.jpg 
Forum Rules And Guidelines 6 5 5 FORUM RULES  AdRock 2009-04-11 23:05:18  avatar_17200.jpg 

第一quert得到最后的5所记录的信息表,这就是我想要的,但我希望能够得到与每条消息的作者有关的头像

+1

您的查询对我看起来不错。请张贴你得到什么,你想得到什么。另请发布'用户'的结构。 – Quassnoi 2010-06-28 11:24:09

+0

你没有得到预期的结果?你得到什么? – Himadri 2010-06-28 11:36:06

+0

为什么avatar,profpic&signature在单独的表中而不是在用户表中?从你最后的回答中,头像似乎在那里'avatar_17200.jpg'?这是你在找什么,因为我似乎无法明白你为什么错过了化身? – DrColossos 2010-06-28 11:46:59

回答

2

似乎你没有填写每条消息的用户和头像。

尝试用OUTER JOINS代替INNER JOINS

SELECT t.topicname, m. *, ms.avatar 
FROM `messages` m 
JOIN topics t 
ON  t.topicid = m.topicid 
LEFT JOIN 
     users u 
ON  u.username = m.author 
LEFT JOIN 
     misc ms 
ON  ms.userid = u.userid 
ORDER BY 
     m.postdate DESC 
LIMIT 5 
+0

非常感谢 我想我有一天尝试过,并且我得到了虚拟形象的NULL。我知道是什么原因造成的,现在可以运行.....非常感谢 – AdRock 2010-06-28 13:19:48