2013-07-15 2 views
2

Я пишу mysql-запрос, который получает информацию правильно, но я не могу написать NSPredicate для этого, потому что я не знаю, как выбрать IN (select) construction.Перенести mysql-запрос в NSPredicate

SELECT * FROM ZPHOTO WHERE ZPHOTOID IN (SELECT ZALBUMID FROM ZPHOTO) AND ZALBUMID = 0; 

Я беру все строки, где albumID = 0, и если albumID содержит этот идентификатор фотографии.

и часть моего NSPredicate:

NSEntityDescription *entity = [NSEntityDescription entityForName:[NSString stringWithFormat:@"%@",name] inManagedObjectContext:context]; 
etchRequest.predicate = [NSPredicate predicateWithFormat:@"photoId IN"] 

ОБНОВЛЕНО: Логика: Существует таблица: screenshot here. Мне нужно вернуть строку, где albumId = 0, и если для этой строки найдено фотоид в объекте albumId. В этом примере мне нужна первая строка. Логика: если albumId = 0, это альбом, если albumId! = 0, значит, эта фотография принадлежит 1-му фотоальбому. Поэтому мне нужно вернуть все альбомы, где количество фотографий не равно нулю. с этим предикатом, я только возвращаю все альбомы, а также альбомы без фотографий.

"albumId = 0" 

Так что мне нужно отфильтровывать альбомы без фотографий. пожалуйста, помогите мне

ОБНОВЛЕНО 2:

возвращает строк без фотографий, я думаю, что проблема с (PHOTOID В% @), я думаю, что он нашел в ЗПК, а не в ALBUMID сущности.

 NSFetchRequest *fr = [[NSFetchRequest alloc]init]; 
     fr.predicate = [NSPredicate predicateWithFormat:@"albumId != %i",statSubId]; // != 0 
     [fr setEntity:entity]; 

     NSError *error; 
     NSArray *albumIds = [context executeFetchRequest:fr error:&error]; 

     NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"photoId" ascending:YES]; 
     [fr setSortDescriptors:[NSArray arrayWithObject:sort]]; 

     fetchRequest.predicate = [NSPredicate predicateWithFormat:@"photoId IN %@ AND albumId == %i", albumIds,statSubId]; 

Обновлено 3

, кажется, как правильно работающее решение. Спасибо вам, ребята!

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"albumId != %i",statSubId]; // != 0 

NSError *error; 
NSArray *albumIds = [context executeFetchRequest:fetchRequest error:&error]; 

NSMutableArray *albId = [NSMutableArray array]; 
for (Photo *photo in albumIds) { 
    [albId addObject:photo.albumId]; 
} 

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"photoId IN %@ AND albumId == %i", albId,statSubId]; 
+0

Это поможет, если вы опишете, как определяется объект Photo (атрибуты, отношения). –

+0

Что * Объекты Core Data * вы определили? Фотоальбом, ...? Какие у них есть свойства? - Обратите внимание, что Core Data использует отношения между объектами, а не идентификаторы или внешние ключи. Возможно, вы перевели таблицы SQL «слишком дословно» в Core Data. –

+0

О фотографии У меня есть только одна сущность, фото и определенные свойства photoId, albumId, то есть NSNumber, название и текст. Я получаю информацию о фото с сервера и не могу изменить структуру, они отправляют мне такую ​​информацию. – gronzzz

ответ

2

Я не думаю, что есть способ добиться того, что с помощью одного ядра выборки данных запроса. Вы должны сделать это в два этапа:

  • Fetch все объекты с albumId != 0 и хранить полученные идентификаторы в массиве albumIds.
  • Используйте предикат

    [NSPredicate predicateWithFormat:@"albumId == 0 AND photoId IN %@", albumIds] 
    

    , чтобы получить желаемый результат.

+0

Или вам просто нужны все альбомы, которые не являются 0? –

+0

На текущей странице мне нужно показать только альбомы, поэтому найдите строки, где albumId = 0 – gronzzz

+0

hm, это странно, но есть какие-то атрибуты, которые не имеют альбомаID! = 0 – gronzzz

0

и может использовать это:

NSPredicate *compoundPredicate = [NSPredicate predicateWithFormat: @"photoId IN(albumId FROM Photo)"]; 
NSPredicate *markPredicate  = [NSPredicate predicateWithFormat: @"ZALBUMID = 0"]; 
NSPredicate *finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates: 
            @[compoundPredicate, markPredicate]]; 
+0

Я получаю эту ошибку: невозможно разобрать строку формата «photoId IN (albumId FROM Photo)». Я думаю, что неправильно использовать FROM в предикате. – gronzzz

+0

@gronzzz: почти невозможно дать правильное решение вашей проблемы, если мы не знаем, как определяется сущность. –

+0

Существует таблица: https://api.monosnap.com/image/download?id=H33APSx4ZVwRf99tpNx5rnzhw Мне нужно вернуть строку, где albumId = 0, и если для этой строки найдена фотография для этой строки, в объекте albumId. В этом примере мне нужна первая строка. – gronzzz