INNER JOIN 同一张表

Posted

技术标签:

【中文标题】INNER JOIN 同一张表【英文标题】:INNER JOIN same table 【发布时间】: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) ? 【参考方案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 $prefixusers 作为用户加入 $prefixusers 作为 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

【讨论】:

以上是关于INNER JOIN 同一张表的主要内容,如果未能解决你的问题,请参考以下文章

left joinright join和inner join

left joinright join和inner join

mysql从一张表查出数据存到另一张表和inner join的用法

INNER JOIN:第二张表的限制为 0,1

MySQL 双表 INNER JOIN , LEFT JOINED 到第三张表,只有一行具有最低值

left join,right join,inner join,full join之间的区别