MySQLとSQLLiteのGroup Byソート原理の違いについて

1168 ワード

1つのテーブルのレコードに対してgroupbyを行う場合、sum、min、maxなどの集約関数を使用することが分からない場合、groupbyのソート規則、例えば以下にMYSQLとSQLLiteを照合する
グループbyの場合、データベースはデータベーステーブルのすべてのレコードを巡ってマッチング処理されることはよく知られています.
次のSQLの目的は、テーブルのgroupidと同じレコードの最新時刻のメッセージをクエリーし、mysqlとsqlliteの文の違いを与えることです.
MYSQL文
SELECT * FROM(
SELECT t.id,t.data_id,t.send_username,t.recv_username,t.message,IFNULL(NULLIF(t.groupid,''),t.recv_username) AS groupid,t.`created_date`
FROM tb_push_data t WHERE STATUS = 0 ORDER BY t.`created_date` desc,t.id desc
) t1
GROUP BY t1.groupid
ORDER BY t1.`created_date` DESC,t1.id DESC

SQLLite文
select * from(
select t.id,t.data_id,t.login_username,t.send_username,t.recv_username,t.message,ifnull(nullif(t.groupid,''),t.send_username) as groupid,t.time
from tb_recved_data t where status = 0 order by t.time asc, t.id asc
) t1
group by t1.groupid
order by t1.time desc,t1.id desc

SQLと照らし合わせると、サブクエリの最後のORDER BYではMYSQLでASCが使用され、SQLLiteではDESCが使用されていることがわかります
その理由は,MYSQLが表を巡回して記録した場合,繰り返しgroupフィールドを発見した場合に無視されるためである.SQLLiteは上書きされています.
そこで、最も遅く送信されたレコードを取得するためにmysqlでdesc、sqlliteでascを使用します.