0

たとえば、私は 3 つのテーブルを持っています。最初は「ユーザー」のように、すべてのユーザーが自分の名前を保存していました。2 番目 - ユーザーのアドレスが格納される「場所」 - 通常、1 人のユーザーに対して 1 つのアドレス。そして 3 番目の「メッセージ」では、通常、すべてのユーザーが多数のレコードを持っています。

そして、これら3つのテーブルを結合するとき-のように

SELECT Users.name, Location.address, Messages.message FROM Users
LEFT JOIN Location ON Location.user_id = Users.id
LEFT JOIN Messages ON Messages.user_id = Users.id
WHERE blah blah

テーブル 'Messages' には各ユーザーの多くのレコードがあるため、結果には多くの重複レコードが含まれます。そして、これらの重複はフェッチを遅くします。そして、私は解決策を探しています。それを最適化する方法です。たとえば、私は - で試しGROUP_CONCAT()ましGROUP BY User.idたが、取得の結果GROUP_CONCAT()が比較的長くなると、GROUP_CONCAT()が返され始めNULLます。そして、私はそれをマスターすることはできません.私は設定group_concat_max_lenmax_allowed_packetて高い値にしようとしました-すべて運がありません.

さて、誰かがこれについて何か考えを持っていますか?

psおそらく重要な注意点として、私の実際のケースでは、「メッセージ」列が1つだけではなく、多くの列とそれらを含む多くの個別の行があることに注意してください。そして、「メッセージ」テーブルは「メッセージ」、「時間」、「受信者」、削除済み、「メディア」などのように見え、GROUP_CONCAT() にはこれらすべてのフィールドが含まれています。

UPD:GROUP_CONCAT()レコードが 1 つだけの場合、すべての結果がドロップされるようNULLです。たとえば、 を使用しGROUP_CONCAT(Messages.message, Messages.time)、場合によっては 1 行の時間が になる場合NULL、NULL が返されます。

4

3 に答える 3

0

テーブル 'Messages' には各ユーザーの多くのレコードがあるため、結果には多くの重複レコードが含まれます。

「重複」とは、一意のメッセージごとに行があり、その行に他の行に存在するユーザー名と場所の値が含まれることを意味しますか? すべてのメッセージを 1 つにまとめて、ユーザーと場所ごとに 1 つの行だけにする方法を求めていますか? スピードのために??

これがパフォーマンスの問題である場合、どのように測定され、何が十分に速いかを知りたいと思います。また、成功した場合、メッセージをどのように区別するのだろうか。

于 2013-03-26T07:05:04.987 に答える
0

この場合、メッセージを保存するために、Mongo のようなドキュメント ストレージ データベースが実際に役立つ可能性があります。

于 2013-03-25T19:53:41.113 に答える
0

あなたはおそらく欲しいgroup_concat(distinct)

SELECT Users.name, group_concat(distinct Location.address) as locations,
       group_concat(distinct Messages.message) as messages
FROM Users
LEFT JOIN Location ON Location.user_id = Users.id
LEFT JOIN Messages ON Messages.user_id = Users.id
WHERE blah blah
group by users.name
于 2013-03-25T19:54:40.870 に答える