2017-07-15 3 views
0

に参加CROSS内の他のテーブルからのユーザー名とIDを交換します:は、この質問は、この1に関してれるMySQLの

table datas     table users   table collections 
dataid | colors | addedby userid | username collectionid | userid | dataid 
-------------------------- ------------------- ------------------------------ 
    1 | blue | 1  1 | Brian   1  | 1 | 1 
    2 | red  | 1  2 | Jason   2  | 2 | 3 
    3 | green | 2  3 | Marie   3  | 1 | 3 
    4 | yellow | 3        4  | 3 | 2 

これらの結果は予想されています

for Brian   
dataid | colors | userid | username 
----------------------------------- 
    2 | red | 1 | Brian 
    4 | yellow | 1 | Marie 

for Jason 
dataid | colors | userid | username 
----------------------------------- 
    1 | blue | 2 | Brian 
    2 | red | 2 | Brian 
    4 | yellow | 2 | Marie 

ユーザーからユーザーIDを継承する行 "addedby"が追加されました。 現時点では、私のクエリは、ユーザー名のdatbyからのaddedbyではなく、ユーザーからのuseridを置き換えます。 私は実際にはユーザーからのユーザーIDではなく、置き換えられたデータからユーザーIDが必要です。 :-)

誰かがこれを解決する手がかりを持っていますか?

ありがとうございます!

歓迎

+1

非常に混乱し、このようにクエリを記述するかもしれないと、信じています。しかし、 'users'テーブルへの2回目の参加が必要なようです。 – dnoeth

答えて

1

もう一度datasテーブルでユーザーテーブルに参加してください。出力では、この結合のユーザー名を使用します。

SELECT 
    d.dataid, 
    d.colors, 
    uo.userid, 
    uo.username 
FROM 
    users u 
     CROSS JOIN 
    datas d 
INNER JOIN 
    users uo 
ON d.added_by = uo.id 

WHERE 
    (u.userid , d.dataid) NOT IN (SELECT 
      c.userid, c.dataid 
     FROM 
      collections c) 
     AND u.userid = 1 

は、そして私はあなたにも

SELECT u.userid, u.username, d.dataid, d.colors 

FROM username u 
INNER JOIN datas d 
    ON u.userid = d.addedby 

WHERE d.dataid NOT IN (
    SELECT dataid 
    FROM collections 
    WHERE userid = 1 
) 
+0

short 'n sweet!この簡単な作業ソリューションのおかげでたくさんありました:-) – GePu

関連する問題