如何在sql中创建嵌套的选择查询

时间:2011-06-18 18:31:24

标签: mysql sql select inner-join

我要做的是为网站创建评论部分,

评论包含用户姓名,电子邮件和评论。我将这些数据存储在“评论”表中

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

5 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,问题是您在commentsusers之间使用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填充。