それで、昨日問題/質問に出くわしました。
私は (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スキャンする必要がないように使用する方法はありますか? そのため、代わりに、ALIASas a tableを使用して上記のクエリを保存し、messagesそこからデータを 2 回 (各部分で 1 回ずつ) 選択しますUNION。
さらに、最初の質問への回答は、「テーブルから選択したものALIASを保存するために使用する方法はありますか?」に対する回答でもあります。time(繰り返しますが、私はそれを2回検索しています)。
実際には、私が行っていることは非効率的ではないかもしれません (最大でも 20 ユーザーになるため)。また、私は数学者であり、好むと好まざるとにかかわらず、効率について多くのことを心配するのが好きです!
どうもありがとうございました。