2016-05-05 2 views
0

私はかなりsqlを使い慣れていて、ユーザがテーブルYにないときにテーブルXからデータを取得しようとしていますIDとプレイヤーへのアクセスは、2sqlテーブルYのコミコンに含まれていないすべてのユーザを選択する

私は少しfurterを説明してみましょうです:

表X(ユーザテーブル)

+-----------+----------+------------+ 
| uid  | access | more data | 
+-----------+----------+------------+ 
| 1   | 2  | .... | 
| 2   | 1  | .... | 
| 3   | 2  | .... | 
+-----------+----------+------------+ 

表Y(世界)

+-----------+-----------+ 
| userUuid | worldUuid | 
+-----------+-----------+ 
| 1   | 1   | 
| 2   | 2   | 
| 3   | 2   | 
+-----------+-----------+ 

私はまだワールド1に追加できるすべてのユーザーを取得したいとき、ユーザー3からユーザー情報を取得したいと考えています。

ユーザー1は既にワールド1にあり、ユーザー2はアクセスレベル2とユーザー3がまだ世界1ではないとアクセスレベル2.

を持っていない私はmedooを使用していますし、これは現時点での私の文です:

$database->select("User", [ 
    "[>]UserInWorld" => ["uid" => "userUid"] 
], [ 
    "uid", 
    "displayname", 
    "surname", 
    "email" 
], [ 
    "AND" => [ 
     "worldUuid[!]" => $worldUuid, 
     "access" => 2 
    ] 
]); 

worldUuidは私がしたいの世界になります追加するユーザーを取得します。

使用する場合 - >デバッグ()をクエリは次のようになります。

SELECT "uid","displayname","surname","email" 
FROM "User" 
LEFT JOIN "UserInWorld" ON "User"."uid" = "UserInWorld"."userUid" 
WHERE "worldUuid" != '4dafb8c0-57234ff2-03eb-af7f7a5e' 
AND "access" = 2 

編集:私は私が正しくあなたを理解していれば、あなたが行うことができるはず

+0

しかし、あなたのサンプルからは、レベルアクセス= 2でuserUidをUserにしたくないようですね。 – scaisEdge

答えて

0

私はmedooクラス

を使用してこれを行う方法を考え出しました
$database->select("User", [ 
    "[>]UserInWorld" => ["uid" => "userUid"] 
], [ 
    "uid", 
    "displayname", 
    "surname", 
    "email" 
], [ 
    "AND" => [ 
     "OR" => [ 
      "worldUuid[!]" => [$worldUuid], 
      "worldUuid" => NULL 
     ], 
     "access" => 2 
    ], 
    "GROUP" => "uid" 
]); 

ここで、$ worldUuidは世界中のユーザーを選択したいと思っています。

これは、次のSQL文を行います:

SELECT "uid","displayname","surname","email" FROM "User" 
LEFT JOIN "UserInWorld" ON "User"."uid" = "UserInWorld"."userUid" 
WHERE ("worldUuid" NOT IN ('1') OR "worldUuid" IS NULL) 
AND "access" = 2 
GROUP BY "uid" 

これは、すでに世界を持っていないか、または世界に私は、ユーザーを取得していますし、彼らがアクセスレベルを持っているすべての(ユニーク)ユーザーを選択します2

1

の下medooを使用してsollutionを掲載このような何か:

SELECT 
    uid, 
    displayname, 
    surname, 
    email 
FROM 
    User 
    LEFT JOIN UserInWorld ON User.uid = UserInWorld.userUid AND worldUuid = 1 
    INNER JOIN (
     SELECT DISTINCT 
      userUid 
     from 
      UserInWorld 
     WHERE 
      worldUuid != 1 
    ) AS InOtherWorld ON InOtherWorld.userUid = User.uid 
WHERE 
    access = 2 
    AND UserInWorld.userUid IS NULL 

左の参加が可能な場合は、世界の人々を接続し、その後UserInWorld.userUid IS NULLは効果的アーカンソーものにそれを取り除くことができます世界ではない。

+0

返事をありがとうが、私はすでにテーブルYに接続しているユーザーを取得したい。私は、特定の世界で既にテーブルYにいるユーザーを取得したくないだけです。 (ユーザーは複数の世界に追加することができます) – Xiduzo

+0

別の世界に既にいる人だけを含むように別の参加を追加しました。 –

+0

あなたの助けてくれてありがとう、良い夜の眠りの後、私はメドーでこれを行う方法を考え出した。私の投稿を更新します – Xiduzo

0

あなたは言った:ユーザーがプレイヤーIDと世界のIDの組み合わせでテーブルYではなく、プレーヤーのアクセスは2

とき

がテーブルXからデータを取得しようとしています私は理解している場合、それは次のようになります。良い睡眠の後

select * from X where X.access = 2 and X.uid not in (
    select Y.userUuid from Y 
) 
+0

これらはテーブルY allreadyにありますが、worldUuidとの組み合わせではありませんX – Xiduzo

+0

意味がある場合:access = 2のすべてのユーザーを選択し、worldUuidに一致してY.userUuidをY.worldUuidに変更するだけです私のコードの答えで –

関連する問題