2016-01-09 3 views
1

У меня есть три таблицыSQLite условное где положение

ZoneTable 
ID, Name 

UserTable 
ID, Name 

UserZone 
ZoneTableID, UserTableID 

Сейчас.

SELECT ID, Name from ZoneTable 

дает мне полный список зон.

Если я сделать следующее

SELECT ZoneTable.ID, ZoneTable.Name from ZoneTable LEFT JOIN UserZone on UserZone.ZoneTableID = ZoneTable.ID WHERE UserTableID = :ID GROUP BY ZoneTable.ID 

дает мне список зон пользователю разрешен в.

Теперь, чтобы сделать вещи раздражают, если пользователь разрешен во всех зонах, то они не делают появляются в UserZone вообще.

Так или иначе, я могу получить список ZoneTableID для конкретного пользователя, если счетчик равен 0, тогда не применяйте предложение where, если count> 0, тогда отображаются только конкретные имена зон, все в одном запросе ,

Если это имеет смысл

Благодаря

+0

Если я понял, вы хотите получить все идентификаторы ZoneID для пользователя, и если у пользователя нет никаких зон, вы хотите получить все имена ZoneNames. Правильно? Вы уверены, что хотите вернуть разные поля? Я думаю, что это две полные различные задачи/функции. Я бы рекомендовал вам разделить их на два утверждения. – etalon11

ответ

1

Примечание: вам не нужно использовать внешнее соединение, а запрос можно переписать в виде:

SELECT ID, Name 
FROM ZoneTable 
WHERE ID IN (SELECT ZoneTableID 
      FROM UserZone 
      WHERE UserTableID = :ID); 

Во всяком случае, вы можете добавить условие в предложение WHERE:

SELECT ID, Name 
FROM ZoneTable 
WHERE ID IN (SELECT ZoneTableID 
      FROM UserZone 
      WHERE UserTableID = :ID) 
    OR NOT EXISTS (SELECT ZoneTableID 
        FROM UserZone 
        WHERE UserTableID = :ID); 

или добавить второй запрос для второго случая:

SELECT ID, Name 
FROM ZoneTable 
WHERE ID IN (SELECT ZoneTableID 
      FROM UserZone 
      WHERE UserTableID = :ID) 
UNION ALL 
SELECT ID, Name 
FROM ZoneTable 
WHERE NOT EXISTS (SELECT ZoneTableID 
        FROM UserZone 
        WHERE UserTableID = :ID); 
0

Вы рассматривали НЕ В подзапрос? Как и в: где ... ИЛИ: ID НЕ ВХОД (выберите usertableid из userzone, где usertableid =: ID)

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