4

それで、昨日問題/質問に出くわしました。
私は (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 ユーザーになるため)。また、私は数学者であり、好むと好まざるとにかかわらず、効率について多くのことを心配するのが好きです!

どうもありがとうございました。

4

3 に答える 3

2

よくわかりませんが、ビューが必要なように見えます。

そのクエリを次のように定義します。

CREATE VIEW MyMessageView
AS
SELECT ...
FROM ...
...

これで、通常のテーブルを使用できる任意のコンテキストでそのビューを使用できるようになりました: FROM 句、JOIN 句、サブクエリなど:

SELECT  ...
FROM MyMessageView
WHERE ...
...
UNION
SELECT ...
FROM MyMessageView
WHERE ...
于 2013-06-20T19:12:06.687 に答える
0

人々が探しているのはVIEWだと思うので、私は自分の質問に答えています。

まず、そのクエリを次のように定義します。

CREATE VIEW MyViewTable
AS
    SELECT ...
    FROM ...
    ...
...;

これで、通常のテーブルを使用できる任意のコンテキスト (FROM 句、JOIN 句、サブクエリなど) で、そのビュー (別のクエリ) を使用できます。

SELECT  ...
FROM MyViewTable
    WHERE ...
    ...

UNION

SELECT ...
    FROM MyViewTable
    WHERE ...

ただし、いくつかの制限があります。

  • 次のようなサブクエリを使用して、ビューからはできませんSELECT

     SELECT * FROM MyViewTable WHERE someColumn = (SELECT ... ...)
    

    ただし、VIEW (通常どおり)メイン クエリで and を作成するときにサブクエリを使用できます。

  • SELECT ステートメントは、準備済みステートメントのパラメーターを参照できません。
  • 定義で TEMPORARY テーブルを参照することはできません。また、TEMPORARY ビューを作成することもできません。

(他にもありますが、私の意見では、これは最も一般的なクエリの 1 つなので、制限は最も一般的なエラーの 1 つかもしれません。詳細については、 SQLite リファレンスを参照してください。)

于 2013-06-21T14:24:35.653 に答える