【问题标题】:How to create a nested select query in sql如何在sql中创建嵌套选择查询
【发布时间】:2011-06-18 18:31:24
【问题描述】:

我要做的是为网站创建一个 cmets 部分,

cmets 由用户名、电子邮件和评论组成。我将此数据存储在“cmets”表中

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

【问题讨论】:

    标签: mysql sql select inner-join


    【解决方案1】:

    如果我正确理解了您的问题,那么问题是您在 comments 和 users 之间使用了 INNER JOIN,这意味着它只会在电子邮件中返回匹配的行。因此它不返回没有电子邮件地址或不匹配电子邮件地址的 cmets 的原因。

    将您的 INNER JOIN 替换为 LEFT 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`;
    

    希望这能帮助您获得所有 cmets。

    【讨论】:

      【解决方案2】:

      不太确定您想要的输出是什么,如何为给定用户获得正确的杂项,但这是一般的想法

      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 语句时非常有用。

      【讨论】:

        【解决方案3】:
        SELECT * FROM comments LEFT JOIN users   
        ON users.email=comments.email 
        

        【讨论】:

          【解决方案4】:

          不太确定这是否是您的意思,但我想您只想在查询结果中添加一些额外的列,其中包含电子邮件地址(如果不可用,则为空)和头像(如果不可用,则为空),如果正确,您可以使用 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。

          【讨论】:

          • 这几乎得到它,但它不显示头像
          【解决方案5】:

          不,你真正需要的是LEFT OUTER JOIN。 它的目的正是您所需要的 - 当在某个键上连接两个(或三个)表并且左表没有对应键时,它的列在该键的结果集中填充为 NULL。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-23
            • 2019-05-06
            • 2019-10-06
            • 2022-01-23
            • 2022-01-17
            • 1970-01-01
            相关资源
            最近更新 更多