0

これは私のデータベースレイアウトです:

  • ID(int-一意の主キー
  • nameuser(int)-列で検索するユーザーの外部キー
  • starttime(タイムスタンプ)-セッション開始時間
  • endtime(タイムスタンプ)-セッション終了時間
  • idletime(int)-アイドル時間(分単位)

たとえば、特定のプレーヤーがオンラインで何分だったか知りたいです。

次のクエリは正常に機能します。約3443分かかります。

SELECT user, 
       SUM(TIMESTAMPDIFF(MINUTE,starttime,endtime)-idletime) 
FROM gc_sessions 
WHERE user = 139

しかし、結合でこれを実行したい場合は、次のクエリを使用して8を取得します。

 SELECT name, 
        SUM(TIMESTAMPDIFF(MINUTE,starttime,endtime)-idletime) 
 FROM gc_sessions 
 JOIN gc_users ON gc_user.id = gc_sessions.id
WHERE name LIKE "variell"

私のクエリの何が問題になっていますか?

4

2 に答える 2

2

次のクエリを試して、結果を教えてください

SELECT `name`, SUM(TIMESTAMPDIFF(MINUTE,`starttime`,`endtime`)-`idletime`) 
    FROM `gc_sessions` inner JOIN `gc_users` ON 
    `gc_sessions`.`user` =`gc_users`.`id` WHERE gc_users.`name` LIKE "variell"
于 2013-01-25T08:49:52.800 に答える
0

試してくださいgroup by

 SELECT name, 
        SUM(TIMESTAMPDIFF(MINUTE,starttime,endtime)-idletime) 
 FROM gc_sessions 
 JOIN gc_users ON gc_user.id = gc_sessions.userid
WHERE name LIKE "variell"
GROUP BY name
;

テーブルスキーマ全体についてはわかりませんが、最初に気付くのは、on gc_users.id = gc_seeions.id. 両方のユーザー ID である必要があります。次のデモによると、クエリがなくても機能しますgroup by。次に考えられる問題は、LIKE演算子に関するものです。正確な名前が必要な場合Variellは、likebut =. 使用したい場合Likeは、この文字列を含む名前を取得しようとしている可能性があると単純に言っています..しかし、テーブルスキーマとサンプルデータを知らなければ、正確な理由をコミットすることは困難です.

結果:

|    NAME | TOTALTIME |
-----------------------
| variell |       308 |

クエリ:

SELECT gu.name, 
        SUM(TIMESTAMPDIFF(MINUTE,gs.starttime,
                          gs.endtime)-gs.idletime) AS TotalTime
 FROM gc_sessions gs 
 JOIN gc_users gu ON gs.userid = gu.id
WHERE gu.name LIKE "%variell%"
GROUP BY gu.name
;

|     NAME | TOTALTIME |
------------------------
| dvariell |       286 |
|  variell |       308 |
于 2013-01-25T09:28:15.037 に答える