2016-05-05 2 views
0

Я довольно новичок в sql и пытаюсь получить данные из таблицы X, когда пользователь не находится в таблице Y с комбинацией идентификатора игрока и мира идентификатор и доступ игрок 2.sql выберите всех пользователей из таблицы X, которые не входят в таблицу 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 

EDIT: Я отправил гуманного, используя Medoo ниже

+0

Но из вашего примера кажется, что вы хотите использовать userUid с уровнем доступа = 2 не в 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

Если я вас правильно понял, вы должны быть в состоянии сделать что-то вроде этого:

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

Спасибо за помощь, после хорошего ночного сна я понял способ сделать это в медуо. WIll обновить сообщение – Xiduzo

0

вы сказали:

пытаюсь получить данные из таблицы X, когда пользователь не в таблице Y с комбинацией игрока Ид и мира удостоверение личности и доступа игрока в 2

Если я понял, что это должно быть:

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

Они могут быть в таблице Y allready, просто не в сочетании с worldUuid X – Xiduzo

+0

Если вы имеете в виду: выберите всех пользователей с доступом = 2 И с corrispondence в worldUuid вам просто нужно изменить Y.userUuid на Y.worldUuid в ответе моего кода –

Смежные вопросы