2015-06-02 7 views
0

Я пытаюсь получить этот SQL-запрос правильно, но я продолжаю получать одну строку с нулевыми значениями.SQLite INNER JOIN WHERE column not null

Итак, у меня есть два стола.

Таблица A является chat Таблица.

Таблица B wallpaper стол.

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

Я пытаюсь получить картинку, прикрепленную к чату с помощью следующего запроса:

const char *query = "SELECT wallpaper.* FROM wallpaper INNER JOIN chat ON wallpaper.id_wallpaper = chat.id_wallpaper AND (chat.id_chat = ? AND chat.id_wallpaper NOT NULL)"; 

внутри моего метода:

-(Wallpaper *)getWallpaperForChatHeaderID:(NSString *)chatHeaderID 
{ 
    sqlite3_stmt *statement; 

    const char *query = "SELECT wallpaper.* FROM wallpaper INNER JOIN chat ON wallpaper.id_wallpaper = chat.id_wallpaper AND (chat.id_chat = ? AND chat.id_wallpaper NOT NULL)"; 

    Wallpaper *wallpaper = nil; 

    if(sqlite3_prepare_v2(_database, query, -1, &statement, nil) == SQLITE_OK) 
    { 
     sqlite3_bind_int(statement, 1, [chatHeaderID intValue]); 

     int statusCode = sqlite3_step(statement); 

     if(statusCode == SQLITE_DONE) 
     { 
      long idWallpaper = sqlite3_column_int(statement, 0); 

      char *dbFilename = (char *)sqlite3_column_text(statement, 1); 

      ... 

      wallpaper = [[Wallpaper alloc] initWithWallpaperID:idWallpaper ....]; 
     } 
     else 
     { 
      NSLog(@"sql step status error code: %d", statusCode); 
     } 

     sqlite3_finalize(statement); 
    } 
    else 
    { 
     NSLog(@"Failed to get wallpaper for chat header with ID: %@", chatHeaderID); 
    } 

    return wallpaper; 
} 

Но что постоянно возвращается мне один wallpaper объекта со всеми поля NULL.

В чате могут быть только 1 обоев. Поэтому я хочу только получить один wallpaper, где он связан с чатом, определенным идентификатором chatHeaderID.

Насколько я могу видеть, SQL запрос нашел соответствующий chat запись из chat таблицы на основе chatHeaderID я прошел в России, но это, кажется, игнорируя мое ИНЕКЕ:

(chat.id_chat = ? AND chat.id_wallpaper NOT NULL) 

Что я ожидая увидеть, что SQL-запрос возвращает 0 записей на данный момент, потому что я не связал записи обоев с любыми записями в чате.

Любые идеи? : D

+0

На самом деле вам не хватает предложения WHERE: 'const char * query =" SELECT wallpaper. * FROM wallpaper INNER JOIN chat ON wallpaper.id_wallpaper = chat.id_wallpaper WHERE chat.id_chat =? И chat.id_wallpaper NOT NULL ";' –

+0

Я, хотя, когда вы помещаете круглые скобки вокруг (chat.id_chat =? И chat.id_wallpaper NOT NULL), это означает ГДЕ? Извините, что мои знания SQL не очень далеки. – Zhang

+0

Я тестировал оба, кажется, работает: P – Zhang

ответ

0

Еще один мой вопрос решается сам =/

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

-(Wallpaper *)getWallpaperForChatHeaderID:(NSString *)chatHeaderID 
{ 
    sqlite3_stmt *statement; 

    const char *query = "SELECT wallpaper.* FROM wallpaper INNER JOIN chat ON wallpaper.id_wallpaper = chat.id_wallpaper WHERE chat.id_chat = ? AND chat.id_wallpaper NOT NULL"; 

    Wallpaper *wallpaper = nil; 

    if(sqlite3_prepare_v2(_database, query, -1, &statement, nil) == SQLITE_OK) 
    { 
     sqlite3_bind_int(statement, 1, [chatHeaderID intValue]); 

     while (sqlite3_step(statement) == SQLITE_ROW) 
     { 
      long idWallpaper = sqlite3_column_int(statement, 0); 

      ... 

      wallpaper = [[Wallpaper alloc] initWithWallpaperID:idWallpaper ...]; 
     } 

     sqlite3_finalize(statement); 
    } 
    else 
    { 
     NSLog(@"Failed to get wallpaper for chat header with ID: %@", chatHeaderID); 
    } 

    return wallpaper; 
} 

Разница здесь я использую:

while(... == SQLITE_ROW) 
{ 
    ... 
} 

условие для проверки соответствия строки, которые также удовлетворяют WHERE условия фильтра :)

Я хочу отметить, что я ве изменил выше запрос SQL с помощью:

SELECT wallpaper.* FROM wallpaper INNER JOIN chat ON wallpaper.id_wallpaper = chat.id_wallpaper WHERE chat.id_chat = ? AND chat.id_wallpaper NOT NULL 

, но я проверил:

SELECT wallpaper.* FROM wallpaper INNER JOIN chat ON wallpaper.id_wallpaper = chat.id_wallpaper AND (chat.id_chat = ? AND chat.id_wallpaper NOT NULL) 

и оба имейте в виду.

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

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