1

2つのテーブルユーザーと*activation_details*があります

ユーザーテーブルにはこれらのデータがあります。uidは主キーです。

uid     |    user_name
______________________
 1     |    John Smith
 2     |    Mary Smith
 3     |    Nancy Smith
 4     |    Agent Smith

Activation_detailsにはこれらのデータがあります

aid     |    is_activated   |  user_id
______________________________________
1      |         0         |     0
2      |         1         |     4
3      |         1         |     1
4      |         1         |     777 

ユーザーID777はusersテーブルにないことに注意してください。

この形式の結果が必要です

aid     |    is_activated   |  user_name      
______________________________________________
1       |         0         |     0
2       |         1         |     Agent Smith
3       |         1         |     John Smith
4       |         1         |     777 

ユーザーIDがusersテーブルに存在する場合は、usernameを表示する必要があります。それ以外の場合は、user_id自体を表示する必要があります。

私はこのようなことを試みました

SELECT aid, is_activated, user_id, users.user_name from activation_details, users WHERE users.uid = user_id

この出力が得られますが、これは役に立ちません。

aid     |    is_activated   |  user_name      | user_id
________________________________________________________ 
2       |         1         |     Agent Smith |     4 
3       |         1         |     John Smith  |     1

とにかくmysqlのみを使用してこの出力を取得することはできますか?PHPで複数のクエリを使用して取得できますが、それは私が探しているものではありません。

aid     |    is_activated   |  user_name
______________________________________
1       |         0         |     0
2       |         1         |     Agent Smith
3       |         1         |     John Smith
4       |         1         |     777 
4

2 に答える 2

3

次のように、外部結合をcoalesce()関数(選択した列の最初の非null値を返す)と組み合わせて使用​​します。

SELECT 
    a.aid, 
    a.is_activated, 
    a.user_id, 
    coalesce(b.user_name, a.user_id, 0) as User
from 
    activation_details a
        left outer join users b
            on a.user_id=b.uid

編集:とフィールドの両方がnull値の場合に、ユーザーにcoalesce()を返す関数のチェックをもう1つ追加しました。0user_nameuser_id

mysqlで行われたテスト:

mysql> select * from first
    -> ;
+------+-------+
| id   | title |
+------+-------+
|    1 | aaaa  |
|    2 | bbbb  |
|    3 | cccc  |
+------+-------+
3 rows in set (0.00 sec)

mysql> select coalesce('a', id) from first
    -> ;
+-------------------+
| coalesce('a', id) |
+-------------------+
| a                 |
| a                 |
| a                 |
+-------------------+
3 rows in set (0.00 sec)

mysql> select coalesce('a', 1) from first;
+------------------+
| coalesce('a', 1) |
+------------------+
| a                |
| a                |
| a                |
+------------------+
3 rows in set (0.00 sec)

mysql> select coalesce(null, 1) from first;
+-------------------+
| coalesce(null, 1) |
+-------------------+
|                 1 |
|                 1 |
|                 1 |
+-------------------+
3 rows in set (0.00 sec)
于 2012-08-21T13:24:36.857 に答える
2
SELECT t3.aid,t3.is_activated,
IF (t2.user_name IS NOT null, t2.user_name, t3.user_id)
FROM activation_details AS t3
LEFT JOIN users AS t2 ON t3.user_id = t2.uid;

このクエリで結果が得られると思います

于 2012-08-21T14:07:24.240 に答える