【问题标题】:MySQL Join SyntaxMySQL 连接语法
【发布时间】:2009-11-02 21:31:06
【问题描述】:

我在理解 MYSQL 连接语法时遇到问题。我似乎无法为我的目的操纵它。几个月来,我不得不使用变通方法,这导致了额外的查询,只是为了检索一个额外的列。

场景:我有两张桌子..

Table.Stories - 包含故事和添加故事的用户 ID。

id、故事、用户 ID

Table.Users - 包含用户详细信息和用户 ID

id,用户名

我想检索包含用户 ID 的故事表以及一个名为 username 的新列(我猜是动态生成的),其中包含 Table.Users 中的相应用户名em>

我猜我会混合使用 ASLEFT JOIN 语法。但是我真的不知道了..

【问题讨论】:

  • 另外请提供您尝试过的查询
  • 我的大部分尝试都导致了错误。已经工作的那些将两张表结合在一起,给了我一堆“不必要的列”。我只想要 Table.Users 中的新用户名列。
  • 尝试看起来与此有些相似。 SELECT * FROM stories LEFT JOIN users ON stories.id = siteusers.id AS username 请原谅我可笑的语法。
  • 谢谢各位好心的先生们。你们及时的反应让我感到惊讶。愿你平安。

标签: sql mysql join


【解决方案1】:
SELECT s.id, s.story, s.userid, u.username FROM stories AS s INNER JOIN users AS u ON s.userid=u.id

接下来的解释。

【讨论】:

  • 假设每个故事都有一个用户,则不需要 LEFT JOIN。 INNER JOIN 要求 JOIN 的每一“边”的表中都有一行,而 LEFT JOIN 只为第二个表中的每一列返回 NULL 值,如果没有符合 ON 条件的行。
【解决方案2】:

以下查询将对您有所帮助:

SELECT s.story, u.username FROM Stories s 
LEFT JOIN Users u ON (u.id=s.userid)

它返回故事记录的story字段的值和相应用户的username

【讨论】:

  • 是的,但是null有什么问题?
【解决方案3】:

这应该可行:

SELECT s.id, s.story, u.username
FROM stories s
INNER JOIN users u
ON u.id = s.userid

这基本上是说:“给我故事 id、故事名称和 Stories 表中的用户,从用户表中查找用户表 ID 与 Stories 表的用户 ID 匹配的用户名。”♦

【讨论】:

    【解决方案4】:
    SELECT st.*, COALESCE(u.username, 'unknown') AS username
    FROM Table.Stores st
    LEFT JOIN Table.Users u ON st.userid = u.id
    

    真的很简单;确保您在 Table.users 中有一个关于 id 的索引。 COALESCE 函数返回第一个不为 null 的参数,因此您可以为找不到用户的故事定义值。

    如果您只对有相应用户的故事感兴趣,请使用

    SELECT st.*, u.username
    FROM Table.Stores st
    JOIN Table.Users u ON st.userid = u.id
    

    这里的内连接是隐式的,不需要指定。

    【讨论】:

      【解决方案5】:

      选择故事。*,来自故事内部的 Users.username 在 Stories.userid = Users.id 上加入用户

      select * from stories inner join Users using(userID)(如果你保持一致的 ID 列)

      【讨论】:

        【解决方案6】:

        如果总是存在一对一的关系,即每个故事总是有一个用户,那么你应该使用内连接:

        select t.id, t.story, t.userid, u.username
        from Table.Stories t
        inner join Table.Users u on u.id = t.userid
        

        如果userid字段可以为null,表示一个故事可以有用户或没有用户,你应该使用左连接:

        select t.id, t.story, t.userid, u.username
        from Table.Stories t
        left join Table.Users u on u.id = t.userid
        

        对于没有用户的故事记录,用户名字段将返回为空。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-29
          • 2011-01-08
          • 1970-01-01
          • 2015-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多