以下は、SQL SERVER で正常に動作します。しかし、PhoneGap アプリケーションの SQLite でクエリを動作させることができません。
シナリオは次のとおりです。
テーブルには、発信者/着信者の電話番号とテキスト メッセージが各行に表示されます。from/to 電話番号の組み合わせの最後のメッセージが何であったかを調べる必要があります。
以下のような表を作成しました。(例は TSQL - SQL Server にあります)。
Create Table SmsLog
(
messageId int identity (1,1) primary key,
messageDate datetime,
fromPhoneNumber varchar(50),
toPhoneNumber varchar(50),
textMessage varchar(50)
)
GO
次に、次のように一連の行を挿入しました。
Insert into SmsLog(MessageDate, FromPhoneNumber, ToPhoneNumber, TextMessage) Values (GetDate(), '+19175380077', '+14255587777', 'Blah 1');
Insert into SmsLog(MessageDate, FromPhoneNumber, ToPhoneNumber, TextMessage) Values (GetDate(), '+19175380077', '+14255587777', 'Blah 2');
Insert into SmsLog(MessageDate, FromPhoneNumber, ToPhoneNumber, TextMessage) Values (GetDate(), '+19175380077', '+14255587777', 'Blah 3');
Insert into SmsLog(MessageDate, FromPhoneNumber, ToPhoneNumber, TextMessage) Values (GetDate(), '+19175380077', '+12149653333', 'Blah 4');
Insert into SmsLog(MessageDate, FromPhoneNumber, ToPhoneNumber, TextMessage) Values (GetDate(), '+19175380077', '+12149653333', 'Blah 11');
Insert into SmsLog(MessageDate, FromPhoneNumber, ToPhoneNumber, TextMessage) Values (GetDate(), '+19175380077', '+14255587777', 'Blah 12');
Insert into SmsLog(MessageDate, FromPhoneNumber, ToPhoneNumber, TextMessage) Values (GetDate(), '+19175380077', '+14254490006', 'Blah 13');
Insert into SmsLog(MessageDate, FromPhoneNumber, ToPhoneNumber, TextMessage) Values (GetDate(), '+19175380077', '+14254490006', 'Blah 21');
Insert into SmsLog(MessageDate, FromPhoneNumber, ToPhoneNumber, TextMessage) Values (GetDate(), '+19175380077', '+14254490087', 'Blah 22');
Insert into SmsLog(MessageDate, FromPhoneNumber, ToPhoneNumber, TextMessage) Values (GetDate(), '+19175380077', '+14254490087', 'Blah 23');
GO
次のクエリは、ジョブを完了する必要があります (これは MSSQL で完全に機能します)。
/* Retrieve the last message per from/to from the table*/
SELECT *
FROM SmsLog
WHERE MessageId IN
(
SELECT MAX(MessageId) as MessageId
FROM SmsLog
GROUP
BY FromPhoneNumber, ToPhoneNumber
)
GO
MSSQL の結果は次のとおりです (これはまさに、データ ストレージとして SQLite を使用するアプリから必要なものです)。
5 2012-10-28 23:32:23.257 +19175380077 +12149653333 Blah 11
6 2012-10-28 23:32:23.257 +19175380077 +14255587777 Blah 12
8 2012-10-28 23:32:23.257 +19175380077 +14254490006 Blah 21
10 2012-10-28 23:32:23.257 +19175380077 +14254490087 Blah 23
しかし、PhoneGap アプリケーション (iOS) の SQLite で同じクエリを使用することはできません。JavaScript コードは次のとおりです。
db.transaction(function(tx)
{
var sqlString = "SELECT * FROM smsLog WHERE messageId IN (SELECT MAX(messageId) AS messageId FROM smsLog GROUP BY fromPhoneNumber, toPhoneNumber";
tx.executeSql (sqlString, [],
function(tx, result)
{
if (console)
{
console.log("in retrive success");
}
var liblock = "";
$.each(result.rows,function(index)
{
var row = result.rows.item(index);
liblock +=
('<li><a href="#"><h3>'+row['toPhoneNumber'] + '</h3><p>' +row['textMessage']+'</p><p class="ui-li-aside"><strong>'+ formatDate(new Date(row['messageDate'])) + '</strong></p></a></li>');
});
$("#topicList").html(liblock);
$("#topicList").listview("refresh");
},
function(err)
{
if (console)
{
console.log(err);
}
});
},
function (dbError)
{
if (console)
{
console.log("ERROR Performing database operation");
console.log(dbError);
}
},
function (dbSuccess)
{
if (console)
{
console.log("Record retreived");
}
});
}