web-dev-qa-db-ja.com

INNER JOIN同じテーブル

同じテーブルからいくつかの行を取得しようとしています。ユーザーテーブルです。ユーザーには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]

しかし、結果は表示されません。ユーザーレコードとその親レコードを表示したい。

21
user1718343

問題は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親のないユーザーがいる場合。

33
Ronnis

次のように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]
2
Prashant16

3つのMySQLテーブル、つまりdatetablecolortableおよび-を使用して、この簡単なシナリオでこの質問に答えてみましょう。 jointable

firsttableの値を参照datetable with primary keyに割り当てられたcolumndateid

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)

secondtable values colortable with primary keyに割り当てられたcolumncolorid

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

最後のthirdtablejointable have noprimary keysおよび値は次のとおりです。

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

Now私たちの条件はdateid'sを見つけることです-colorblueおよびyellow

したがって、クエリは次のとおりです。

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
ArifMustafa

おそらくこれが選択されるはずです(質問を正しく理解している場合)

select user.user_fname, user.user_lname, parent.user_fname, parent.user_lname
... As before
1
Ed Heal

テーブルの作成方法がわかりませんが、これを試してみてください...

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
ioses

クエリは正常に動作するはずですが、エイリアス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];
1
Mahmoud Gamal