【问题标题】:How to use Union Inner Join Query?如何使用联合内连接查询?
【发布时间】:2017-03-11 17:03:52
【问题描述】:

我有一个以前的员工创建的查询并且工作正常。但是,我需要在其中添加一个名为“info”的表,并且很难使用它。 'info' 表有一个用户列,应该与用户表中的 user_id 列匹配。

info 表有用户(即用户 ID)、公司、电话、全名等列。该查询当前通过电子邮件将 a 发送给注册到特定投标的用户。然后创建一个日志文件,在该日志文件中我需要显示信息表中的信息,例如公司、电话和全名。

我尝试在第一个 INNER JOIN 之后添加它,如下所示:

INNER JOIN info
 ON info.user = users.user_id

查询将运行,但当我尝试显示它时,它不会从信息表中获取任何信息。

以下是有效的查询:

$sql = '
        SELECT users.user_id
             , users.username
          FROM users
        INNER
          JOIN registrations
            ON registrations.user = users.user_id
           AND registrations.tender = '.mysql_real_escape_string($tender).'

        UNION 
        SELECT users.user_id
             , users.username
          FROM users

        INNER
          JOIN user_divisions
            ON user_divisions.user = users.user_id

        INNER
          JOIN tender_divisions
            ON tender_divisions.division = user_divisions.division    
           AND tender_divisions.tender = '.mysql_real_escape_string($tender).'

        WHERE
            users.verified = 1 
        GROUP 
            BY users.user_id
        ';

【问题讨论】:

  • 您应该添加有关您的信息表的详细信息并显示您尝试过的内容
  • @thomasG - 现在刚刚更新。
  • SELECT users.user_id, users.username 就是它所做的一切(选择),无论您加入多少表。添加适当的选择字段以获得更详细的结果。

标签: php mysql


【解决方案1】:

使用相同的格式
确保所有用户都存在于用户表中以显示所有信息数据
选择 users.user_id
, users.username
来自信息
内部
加入用户
ON info.user =users.user_I'd

【讨论】:

    【解决方案2】:

    根据您的输入,这应该可以工作(我已格式化 SQL 以匹配我的风格)

            SELECT users.user_id, users.username, info.*
            FROM users
              INNER JOIN registrations ON  registrations.user = users.user_id
                                       AND registrations.tender = '.mysql_real_escape_string($tender).'
              INNER JOIN info ON info.user = users.user_id    
    
        UNION 
    
            SELECT users.user_id , users.username, info.*
            FROM users
              INNER JOIN user_divisions ON user_divisions.user = users.user_id
              INNER JOIN tender_divisions ON  tender_divisions.division = user_divisions.division    
                                          AND tender_divisions.tender = '.mysql_real_escape_string($tender).'
              INNER JOIN info ON info.user = users.user_id            
            WHERE users.verified = 1 
            GROUP BY users.user_id
    

    如果初始查询工作正常,它没有理由不工作。

    如果它没有返回任何记录,则表示您的用户表和信息表之间没有匹配项。您可以将INNER JOIN 更改为LEFT JOIN 来验证这一点。


    备注:

    我不喜欢最后一个查询中的GROUP BY。它适用于 MySQL,但这不是 ANSI 标准,如果您移动到另一个 DB 并激活 ONLY_FULL_GROUP_BY 模式,您可能会遇到问题

    SELECT 中的列应该与 GROUP BY 中的列相同。如果目标是删除重复项(看起来你没有在SELECT 中使用聚合函数),那么你应该改用DISTINCT

    值得一读:MySQL Handling of GROUP BY

    【讨论】:

    • 感谢您的帮助!我不得不取出 info.* 因为它不是 users 表中的列。但是,它没有用。这很奇怪,因为我在信息表中有一个名为“user”的用户 ID,即 600。我在用户表“user_id”中也有相同的用户 ID。它应该匹配。
    • info.* 表示信息表中的所有列。您应该对此进行调试: 1. 分别运行 2 个查询并观察结果。 2. 将连接从 INNER 更改为 LEFT 并再次检查。使用SELECT *,显示所有列以找出什么是空的。我不能说更多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2016-11-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多