Поиск несвязанных пользователей из таблицы - PullRequest
0 голосов
/ 25 января 2019

У меня есть массив имен пользователей в качестве пользователей: [Test1, Test2]. Мне нужно пройти через этот массив и найти несопоставимые имена пользователей из таблицы b. Я написал запрос следующим образом:

def usersArray = []
def find

params.users.each{

        find= sql.rows("select distinct name from table a,table b where a.id=b.id and b.name!=:n",[n:it])

        if(find.size >0)
        {
           def usList = ["nm":find]
           usersArray.push(usList);
        }
    }

Из приведенного выше решения в моем результате я вижу как Тест 1, так и Тест 2, даже если они совпадают. Как мне изменить запрос, чтобы отображались только несопоставленные пользователи?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Другой способ - сосчитать существующие строки, которые соответствуют имени параметра, затем нажать те, которые имеют ноль (простите за неправильный синтаксис):

....
numberFound = sql.rows("select count(*)from table a where a.name=:n",[n:it])
if(numberFound = 0)
{
   def usList = ["nm":find]
   usersArray.push(usList);
}
...
0 голосов
/ 25 января 2019

Вот пример того, как вы можете решить эту проблему.Предполагается, что у вас есть класс домена User со свойством name, которому вы хотите соответствовать.

// given a list of user names
​List users = ['Test1', 'Test2', 'Test3', 'Test4']

// find all the users that match those names, and collect the matched names into a List
List matched = User.findAll("from User as u where u.name in (:names)", [names: users]).collect { it.name }

// remove the matched names from the user list and arrive at an 'unmatched' names list
List unmatched = users.minus(matched)​​

Это было записано на моей голове, поэтому, пожалуйста, прости любые опечатки или другиеслучайные предположения.

ОБНОВЛЕНО Поскольку вы, похоже, настроены на использование SQL, вы могли бы сделать что-то подобное вместо этого

List users = ['Test1', 'Test2', 'Test3', 'Test4']
List placeholders = []
users.each { placeholders << '?' }
String select = "select distinct name from table a,table b where a.id=b.id and b.name in (${placeholders.join(',')})"
List matched = sql.rows(select, users)
List unmatched = users.minus(matched)​​
...