INNER JOIN同一张表

37

我想从同一张表中获取一些行。这是一个用户表:每个用户都有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)? - Vit
6个回答

50

我认为问题出在你的 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”的TEXT,这意味着2个用户的详细信息。因此,在这种情况下,我的最终工作查询如下:$query = " select user.user_fname, user.user_lname, parent.user_lname AS plname, parent.user_fname AS pfname from {$prefix}users as user join {$prefix}users as parent on parent.user_id IN(user.user_parents) where user.user_id =".$id; 再次感谢大家。 - user1718343
1
@user1718343 永远不要像那样在列中存储分隔数据。 - Joel Coehoorn

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]

1

让我们尝试用一个好的简单场景来回答这个问题,使用3个MySQL表,即datetablecolortablejointable

首先查看具有primary key分配给columndateidtabledatetable的值:

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)

现在我们转到第二个表的colortable值,其中primary key分配给colorid列。请保留HTML标记。
mysql> select * from colortable;
+---------+------------+
| colorid | colorvalue |
+---------+------------+
|      11 | blue       |
|      12 | yellow     |
+---------+------------+
2 rows in set (0.00 sec)

我们的最后一个第三表格联合表没有主键,其值为:

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

现在我们的条件是找到具有蓝色黄色两种颜色值的日期ID

因此,我们的查询是:

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)

希望这能帮助很多人。

1

我不知道表格是如何创建的,但可以尝试这样做...

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

1
也许这应该是选择(如果我正确理解问题)。
select user.user_fname, user.user_lname, parent.user_fname, parent.user_lname
... As before

1
你的查询应该没有问题,但是你需要使用别名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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接