我要做的是为网站创建评论部分,
评论包含用户姓名,电子邮件和评论。我将这些数据存储在“评论”表中
CREATE TABLE `comments` (
`commentid` int(5) NOT NULL auto_increment,
`user` varchar(40) NOT NULL default '',
`email` varchar(100) NOT NULL default '',
`comment` text NOT NULL,
PRIMARY KEY (`commentid`)
)
我想要做的是执行一个抓取所有这些数据的查询,同时检查“用户”表中的电子邮件地址,看它是否存在。如果是,请从'misc'表中获取头像。如果“用户”表中不存在该电子邮件,则只留空。
在我尝试的查询中,如果电子邮件存在于“用户”表中,它只会抓取3个表中的数据。我有另一个评论,作为匿名用户离开,但不会被查询抓住。
CREATE TABLE `users` (
`userid` int(25) NOT NULL auto_increment,
`email` varchar(255) NOT NULL default '',
`username` varchar(25) NOT NULL default '',
PRIMARY KEY (`userid`)
)
CREATE TABLE `misc` (
`miscid` int(4) NOT NULL auto_increment,
`userid` varchar(3) NOT NULL default '',
`avatar` varchar(100) NOT NULL default '',
PRIMARY KEY (`miscid`)
)
我很确定我需要一个嵌套的选择作为列名,这样如果有一个电子邮件显示在那里......如果不是,它就会留空。
编辑:
制作表格结构应该如何。
这是我刚试过的查询,但它只显示一个有电子邮件地址的行。应该有另一个没有电子邮件地址
SELECT c.comment, c.user, av.avatar
FROM comments c
INNER JOIN users u ON c.email = u.email
LEFT OUTER JOIN (
SELECT userid, avatar
FROM misc
) AS av ON av.userid = u.userid
答案 0 :(得分:1)
如果我正确理解了您的问题,问题是您在comments
和users
之间使用INNER JOIN,这意味着它只会返回电子邮件中的匹配行。因此,它不会返回没有电子邮件地址或不匹配的电子邮件地址的评论。
用LEFT JOIN替换INNER JOIN。试试这个查询:
SELECT `c`.`comment`, `c`.`user`, `m`.`avatar`
FROM `comments` `c`
LEFT JOIN `users` `u` ON `c`.`email` = `u`.`email`
LEFT JOIN `misc` `m` ON `m`.`userid` = `u`.`userid`;
希望能帮助你得到所有评论。
答案 1 :(得分:0)
不确定您想要的输出是什么,如何为给定用户获得正确的misc,但这是一般的想法
SELECT userid, email, username, IF(email<>'',(SELECT avatar from misc where miscid = users.userid),null) avater FROM users;
这是一个更易阅读的版本
SELECT
userid,
email,
username,
IF(email<>''
,/*then*/(SELECT avatar from misc where miscid = users.userid)
,/*else*/null)
as avater
FROM users;
请提供明确的表格列表和所需的输出示例,我们可以提供更好的协助。
在设计MySQL语句时,最终所需的示例输出非常有用。
答案 2 :(得分:0)
SELECT * FROM comments LEFT JOIN users
ON users.email=comments.email
答案 3 :(得分:0)
不确定这是不是你的意思,但我猜你只想在你的查询结果中加上一些额外的列,其中包含电子邮件地址(如果不可用则为空)和头像(如果不可用则为空),如果这是正确的你可以使用LEFT JOIN。
SELECT
c.*,
u.email,
m.avatar
FROM
comments as c LEFT JOIN
users as u ON (u.userid = c.user) LEFT JOIN
misc as m ON (m.miscid = u.userid)
请注意,您使用的列名非常奇怪且不一致;只使用名称id作为列的id,并仅引用其他模型中的那些id。
答案 4 :(得分:0)
不,你真正需要的是LEFT OUTER JOIN
。
它的目的正是你所需要的 - 当在一些键上连接两个(或三个)表并且左表没有对应键时,它的列在该键的结果集中用NULL填充。