それで、昨日問題/質問に出くわしました。
私は (AJAX を使用して) チャットを構築しており、2 つのテーブルを使用しています。
TABLE users -> 'name', 'username', 'password', 'time'
TABLE messages -> 'sendFrom', 'sendTo', 'message', 'time'
したがって、メッセージの例は次のようになります
'foo' | 'bar' | 'Hey, how are you?' | 130611134427611
これを行う正しい方法は、代わりにID
列を使用し、それをユーザー名の代わりに主キーとして使用することだと言われました(とにかく、これは理にかなっています)。
さて、これは次のようになります
TABLE users -> 'ID', 'name', 'username', 'password', 'time'
TABLE messages -> 'sendFrom', 'sendTo', 'message', 'time'
したがって、メッセージの例は次のようになります
'22' | '7' | 'Hey, how are you?' | 130611134427611
最初のメッセージ例のように、両方のテーブルで行を返すことができましたJOIN
が、ユーザーのキー押下も検出しているため、テーブルを 2 回スキャンする必要があるため、次のようになります。
SELECT *
FROM (SELECT *
FROM (SELECT *
FROM messages
WHERE sendTo = '$username'
AND time > (SELECT time FROM users
WHERE username = '$username' LIMIT 1)
AND message <> '$keypressCode'
ORDER BY time DESC LIMIT 30)
ORDER BY time ASC)
UNION
SELECT *
FROM (SELECT *
FROM messages
WHERE message = '$keypressCode'
AND time > (SELECT time FROM users
WHERE username = '$username' LIMIT 1)
AND sendTo = '$username' LIMIT 1);
しかし、もちろん、メッセージから選択するだけではありません。代わりに、次のような長いクエリを使用します
SELECT * FROM (
SELECT u1.ID as sendTo, u2.ID as sendFrom, messages.message, .....
.....
.....
.....
.....
) as messages;
の代わりに挿入する必要messages
があります(まだ試していませんが、そのようなものだと思います。ほら、DuckDuckGo'edとGoogleで検索しても何も見つからなかったので、ここに来ました)
私の最初の質問はALIAS
、テーブルを 2 回messages
スキャンする必要がないように使用する方法はありますか? そのため、代わりに、ALIAS
as a tableを使用して上記のクエリを保存し、messages
そこからデータを 2 回 (各部分で 1 回ずつ) 選択しますUNION
。
さらに、最初の質問への回答は、「テーブルから選択したものALIAS
を保存するために使用する方法はありますか?」に対する回答でもあります。time
(繰り返しますが、私はそれを2回検索しています)。
実際には、私が行っていることは非効率的ではないかもしれません (最大でも 20 ユーザーになるため)。また、私は数学者であり、好むと好まざるとにかかわらず、効率について多くのことを心配するのが好きです!
どうもありがとうございました。