【问题标题】:INNER JOIN same tableINNER JOIN 同一张表
【发布时间】:2013-01-25 15:29:32
【问题描述】:

我正在尝试从同一张表中获取一些行。这是一个用户表:用户有user_iduser_parent_id

我需要获取user_id 行和user_parent_id 行。我编写了这样的代码:

SELECT user.user_fname, user.user_lname
FROM users as user
INNER JOIN users AS parent
ON parent.user_parent_id = user.user_id
WHERE user.user_id = $_GET[id]

但它没有显示结果。我想显示用户记录及其父记录。

【问题讨论】:

  • 也许只是 SELECT * FROM users WHERE (id = 4 OR parent_id = 4) ?

标签: mysql sql join self-join


【解决方案1】:

我认为问题在于您的JOIN 条件。

SELECT user.user_fname,
       user.user_lname,
       parent.user_fname,
       parent.user_lname
FROM users AS user
JOIN users AS parent 
  ON parent.user_id = user.user_parent_id
WHERE user.user_id = $_GET[id]

编辑: 如果有没有父母的用户,您可能应该使用LEFT JOIN

【讨论】:

  • 感谢大家的输入。我实际上在测试时没有设置父 ID,现在它可以工作了。还有一件事可能会对某人有所帮助,我将 user_parents 保存为格式为“的文本” 1,2" 所以它表示 2 个用户的详细信息。所以在这种情况下,我的最终工作查询如下: $query = " select user.user_fname, user.user_lname, parent.user_lname AS plname, parent.user_fname AS pfname from { $prefix}users 作为用户加入 {$prefix}users 作为 parent.user_id IN(user.user_parents) where user.user_id =".$id;再次感谢大家..
  • @user1718343 从来没有EVER在列中存储这样的分隔数据。
【解决方案2】:

你也可以像 UNION 一样使用

SELECT  user_fname ,
        user_lname
FROM    users 
WHERE   user_id = $_GET[id]
UNION
SELECT  user_fname ,
        user_lname
FROM    users 
WHERE   user_parent_id = $_GET[id]

【讨论】:

    【解决方案3】:

    让我们试着用一个简单的场景来回答这个问题,有 3 个 MySQL 表,即 datetablecolortable 和 可连接。

    首先查看table datetable的值,primary key 分配给column dateid

    mysql> select * from datetable;
    +--------+------------+
    | dateid | datevalue  |
    +--------+------------+
    |    101 | 2015-01-01 |
    |    102 | 2015-05-01 |
    |    103 | 2016-01-01 |
    +--------+------------+
    3 rows in set (0.00 sec)
    

    现在移动到我们的 second tablecolortable 并将 primary key 分配给 column colorid

    mysql> select * from colortable;
    +---------+------------+
    | colorid | colorvalue |
    +---------+------------+
    |      11 | blue       |
    |      12 | yellow     |
    +---------+------------+
    2 rows in set (0.00 sec)
    

    我们最后的 third table jointableno primary keys 和值是:

    mysql> select * from jointable;
    +--------+---------+
    | dateid | colorid |
    +--------+---------+
    |    101 |      11 |
    |    102 |      12 |
    |    101 |      12 |
    +--------+---------+
    3 rows in set (0.00 sec)
    

    现在我们的条件是找到 dateid 的,它同时具有 colorblue黄色

    所以,我们的查询是:

    mysql> SELECT t1.dateid FROM jointable AS t1 INNER JOIN jointable t2
        -> ON t1.dateid = t2.dateid
        -> WHERE
        -> (t1.colorid IN (SELECT colorid FROM colortable WHERE colorvalue = 'blue'))
        -> AND
        -> (t2.colorid IN (SELECT colorid FROM colortable WHERE colorvalue = 'yellow'));
    +--------+
    | dateid |
    +--------+
    |    101 |
    +--------+
    1 row in set (0.00 sec)
    

    希望,这会对很多人有所帮助。

    【讨论】:

      【解决方案4】:

      也许这应该是选择(如果我理解正确的话)

      select user.user_fname, user.user_lname, parent.user_fname, parent.user_lname
      ... As before
      

      【讨论】:

        【解决方案5】:

        您的查询应该可以正常工作,但您必须使用别名 parent 来显示父表的值,如下所示:

        select 
          CONCAT(user.user_fname, ' ', user.user_lname) AS 'User Name',
          CONCAT(parent.user_fname, ' ', parent.user_lname) AS 'Parent Name'
        from users as user
        inner join users as parent on parent.user_parent_id = user.user_id
        where user.user_id = $_GET[id];
        

        【讨论】:

          【解决方案6】:

          我不知道表是如何创建的,但试试这个...

          SELECT users1.user_id, users2.user_parent_id
          FROM users AS users1
          INNER JOIN users AS users2
          ON users1.id = users2.id
          WHERE users1.user_id = users2.user_parent_id
          

          【讨论】:

            猜你喜欢
            • 2016-10-14
            • 1970-01-01
            • 1970-01-01
            • 2014-10-31
            • 1970-01-01
            • 1970-01-01
            • 2013-05-28
            • 2016-11-01
            • 2011-03-12
            相关资源
            最近更新 更多