【问题标题】:how to join 2 mysql tables如何加入2个mysql表
【发布时间】:2023-03-12 15:22:01
【问题描述】:

我想连接两个表以从两个表中获取数据,例如,考虑以下两个表:

Table users:
ID      user_name       email     ...    ....


Table messages:
ID      user_name       message     ...    ...

user_name 是两个表中的公共列。如何连接两个表,以便我可以从两个表中获取数据。例如,我想从表messages 中选择“message”,从表“users”中选择“email”,其中user_name 是abc。

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    用途:

    SELECT u.*, m.*
      FROM USERS u
      JOIN MESSAGES m ON m.user_name = u.user_name
     WHERE u.user_name = 'abc'
    

    ...查看所有在表格中有消息的用户。这意味着没有消息的用户将不会出现在输出中 - 因此您可能希望使用以下内容:

       SELECT u.*, m.*
         FROM USERS u
    LEFT JOIN MESSAGES m ON m.user_name = u.user_name
        WHERE u.user_name = 'abc'
    

    我推荐:

    • 阅读Visual Explanation of JOINs
    • 不使用用户名作为标准来链接表之间的数据,因为用户名可以更改,这需要更新此示例中的所有支持表。
    • 不使用 ANSI-89 连接语法,因为它不支持 OUTER 连接,因此应被视为已弃用。我的示例是 ANSI-92 语法,并得到广泛支持。

    【讨论】:

    • 您忘记了 OP 声明的 WHERE user_name = 'abc' 要求。
    • @Tomalak Geret'kal:已更正,尽管添加自己的内容很简单。
    【解决方案2】:

    如果您查看 MySQL 网站,那里有很多示例。在大多数情况下,如果您展示了一些您尝试过但没有得到您想要的结果的查询,人们会更乐意回答。

    select users.user_name, users.email, messages.message from users,messages where users.user_name=messages.user_name where users.user_name='abc'
    

    这是一个相当基本的 SQL 语句。你可以做很多聪明的事情。你最好去看看你还能做什么,而不是嵌入'abc'部分,你可以使用参数等。

    【讨论】:

    • 我有阅读障碍,我花了很多时间尝试正确拼写。结果我的语法往往会受到影响,因为我从来没有被教过。我几乎自学了我所知道的一切。所以,我很抱歉,但我很遗憾我在一个网站上因技术问题而受到批评。
    • @Tomalak Geret'kal:以后请多体谅——不是所有参与 SO/etc 的人都是以英语为母语的人,而且可能有学习困难。提供建设性的批评就是建议如何更好地重写这个,以防你[谢天谢地]没有机会自己做。
    • 经过反思,不值得投反对票。对不起。但是,它会阻止我投票,因为它不是一个易于阅读的答案;例如,阅读障碍不会阻止你写大写字母和句号。
    【解决方案3】:
    SELECT message, email
    FROM users U, messages M
    WHERE U.user_name = 'abc' AND U.user_name = M.user_name;
    

    【讨论】:

    • Yuck - ANSI-89 连接语法:/
    • :) 这是我的数据库书籍中使用的语法。好吧,现在我知道它叫做 ANSI-89,还有 ANSI-92。谢谢!
    • 是的,它是有效的,但被认为已弃用。当 1992 年的标准取代它时,教科书将其永久化,有点可悲:/
    【解决方案4】:
    select m.message, u.email
    from 
       messages m join users u on
          m.user_name = u.user_name
    where
       u.user_name = 'abc'
    

    【讨论】:

      【解决方案5】:

      如果您想要两个表中匹配的数据(所以不是没有消息的用户):

      SELECT * FROM users u, messages m WHERE u.user_name = m.user_name;
      

      如果您希望所有用户都不管消息和消息给那些拥有它们的用户:

      SELECT * FROM users u LEFT JOIN (messages m) ON (u.user_name = m.user_name);
      

      编辑:对不起,我看错了。

      SELECT * FROM users u, messages m WHERE u.user_name = m.user_name AND u.user_name = "abc";
      

      【讨论】:

        猜你喜欢
        • 2022-11-06
        • 2012-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-11
        • 1970-01-01
        • 2013-10-30
        • 1970-01-01
        相关资源
        最近更新 更多