1

私はメッセージという名前のこのデータベーステーブルを持っています:

Column          Type    

global_ref_id   int(12)          
to              int(12)      
from            int(12)      
message         text             
status          int(1)   
viewed          int(1)

ここで、global_ref_id はメッセージの ID (テーブル イベントからの外部キー)、to はメッセージを受信したユーザーのユーザー ID、from はメッセージを送信したユーザーのユーザー ID です。

各ユーザーからユーザーへの最後のメッセージ (たとえば、user_id が 192 のユーザー) を表示し、各ユーザーからユーザーへのメッセージの総数を 192 にするクエリを生成したいと考えています。

これまで、結果を取得するために次のクエリを思いつきました。

> SELECT messages.*
>                 FROM messages, events
>                 WHERE events.global_id = messages.global_ref_id
>                 AND to = 192
>                 GROUP BY messages.from
>                 ORDER BY events.event_time DESC
4

5 に答える 5

0

クエリの最小値を変更するには、次のようにします(ちなみにテストされていません)。

SELECT * FROM 
(
    SELECT messages.*,events.event_time, COUNT(messages.from) as "Total Messages Between Users"
    FROM messages, events
    WHERE events.global_id = messages.global_ref_id
    AND messages.to = 192
    GROUP BY messages.from
    ORDER BY messages.from
)
AS EVENTS
ORDER BY events.event_time
LIMIT 1; 

LIMIT 1最後のメッセージのみを表示します。最後のメッセージだけでなくすべてのメッセージが必要な場合は削除します。

于 2012-11-19T11:46:56.553 に答える
0

各ユーザーからユーザーへの最後のメッセージを表示した結果(たとえば、user_idが192の場合)

SELECT 
    messages.message as 'Last Message'
FROM 
    messages, events
WHERE 
    events.global_id = messages.global_ref_id
AND to = 192
GROUP BY messages.from
ORDER BY events.event_time DESC
LIMIT 1 

各ユーザーからユーザーへのメッセージの総数192

SELECT 
    messages.*, COUNT(messages.from) as "Total number of Messages to User"
FROM 
    messages, events
WHERE 
    events.global_id = messages.global_ref_id
AND to = 192
GROUP BY messages.from
ORDER BY events.event_time DESC 
于 2012-11-19T11:59:28.810 に答える
0

最後に、このクエリがどれほど優れているかはわかりませんが、私にとってはうまくいっているという答えを思いつきました:-

SELECT messages.global_ref_id,
messages.`to`,
messages.`from`,
messages.message,
messages.status,
messages.viewed,
events.event_time,
count_table.msg_count as `total Number of messages`
FROM
messages
INNER JOIN
(select max(global_ref_id) as ref_id, count(*) msg_count from messages group by `from`)
as count_table
on (messages.global_ref_id = count_table.ref_id)
INNER JOIN events
on (events.global_id = messages.global_ref_id)
where messages.`to` = 192
order by events.global_id DESC

みんなありがとう...

于 2012-11-20T07:07:56.363 に答える
0

これはあなたが望むものだと思いますが、私はMySQLが初めてです。

http://sqlfiddle.com/#!2/d0586/8

メートル。toそしてM。fromこれらは予約語であるため、後ろの目盛りになっています。

それが役に立てば幸い!

于 2012-11-19T12:56:35.820 に答える
0
SELECT
m.global_ref_id,
m.`to`,
m.`from`,
m.message,
m.status,
m.viewed
FROM messages m
WHERE m.global_ref_id = (SELECT max(i.global_ref_id)
                         FROM messages igroup
                         WHERE i.`to` = m.`to`
                         AND i.`from` = m.`from`);

最新のメッセージが表示されます。合計を取得することは別のクエリになります...

SELECT
m.`to`,
m.`from`,
count(*)
FROM messages m
GROUP BY m.`to`, m.`from`

これら 2 つのクエリからの出力をマージすることは、別の問題です。

于 2012-11-19T14:45:21.283 に答える