INNER JOIN 同一张表
Posted
技术标签:
【中文标题】INNER JOIN 同一张表【英文标题】:INNER JOIN same table 【发布时间】:2013-01-25 15:29:32 【问题描述】:我正在尝试从同一张表中获取一些行。这是一个用户表:用户有user_id
和user_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
表,即 datetable、colortable 和 可连接。
首先查看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 table
值 colortable 并将 primary key
分配给 column
colorid:
mysql> select * from colortable;
+---------+------------+
| colorid | colorvalue |
+---------+------------+
| 11 | blue |
| 12 | yellow |
+---------+------------+
2 rows in set (0.00 sec)
我们最后的 third table
jointable 有 no primary keys
和值是:
mysql> select * from jointable;
+--------+---------+
| dateid | colorid |
+--------+---------+
| 101 | 11 |
| 102 | 12 |
| 101 | 12 |
+--------+---------+
3 rows in set (0.00 sec)
现在我们的条件是找到 dateid 的,它同时具有 color 值 blue 和 黄色。
所以,我们的查询是:
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的用法