質問

こういうことができるよう選択行の集テーブルからのeメールグループによってからます。私のクエリは以下のようなものです:

SELECT 
    `timestamp`, `fromEmail`, `subject`
FROM `incomingEmails` 
GROUP BY LOWER(`fromEmail`) 
ORDER BY `timestamp` DESC

クエリをほとんど作品になっていただきたいと思いますを選択し記録をグループ化によるe-mail<url>このタイムスタンプな対応最新の録音は、特にe-メールアドレスにお送りします。

例えば、を返すことがあります。:

fromEmail: john@example.com, subject: hello
fromEmail: mark@example.com, subject: welcome

場合データベース内のレコードには:

fromEmail: john@example.com, subject: hello
fromEmail: john@example.com, subject: programming question
fromEmail: mark@example.com, subject: welcome

場合は"プログラミングの問い"と容易に照合することができ、その最も最近のようにしてほしいのですがMySQLを選択するグループ化のメール?

役に立ちましたか?

解決

このグループに参加"ボタンが包み込むクエリを入subselectの順書 適用のグループ :

SELECT * FROM ( 
    SELECT `timestamp`, `fromEmail`, `subject`
    FROM `incomingEmails` 
    ORDER BY `timestamp` DESC
) AS tmp_table GROUP BY LOWER(`fromEmail`)

これは、その参加が見えアのキャンセル手数料無料

を用いた骨材列を選択し、グループによる節は非標準装備。MySQLは戻り値の最初の行できるようにするためのlibsoupおよび廃棄ついてご覧いただけます。ORDER BY条項のさざなみ会の皆さん、返されるカラムの値ではなく、破棄されます。

重要な更新 非骨材使用されるカラムの仕事を実際にも依拠されるべきではありません.当たりの MySQLの文書 "これは主としてすべての値をnonaggregated欄に名前が付けられていないのグループの各グループサーバは 選択の自由に任意の値 各グループは、 ない限り、同じ価値観を選択は不確定になります。."

としての5.6.21いということに気付き、グループの一時テーブルの降順に並べ替えることにより.

としての 5.7.5 ONLY_FULL_GROUP_BYはデフォルトで有効となっており、することはできない非集計す。

http://www.cafewebmaster.com/mysql-order-sort-group https://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

他のヒント

ここに1つのアプローチです:

SELECT cur.textID, cur.fromEmail, cur.subject, 
     cur.timestamp, cur.read
FROM incomingEmails cur
LEFT JOIN incomingEmails next
    on cur.fromEmail = next.fromEmail
    and cur.timestamp < next.timestamp
WHERE next.timestamp is null
and cur.toUserID = '$userID' 
ORDER BY LOWER(cur.fromEmail)

基本的には、後で行を探して、自分自身の表を結合します。 where句では、後で行が存在することはできないと述べています。これはあなただけで、最新の行を与えます。

同じタイムスタンプを持つ複数のメールがある場合は、

、このクエリは精錬が必要になります。

:電子メールのテーブルの増分ID列がある場合、同様に、JOINを変更
LEFT JOIN incomingEmails next
    on cur.fromEmail = next.fromEmail
    and cur.id < next.id

このようなGROUP BYでクエリをラップすることにより、ORDER BYの後にGROUP BYを実行します:

SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from
GROUP BYは、任意のウィンドウからレコードを選択するので、

すでに回答で指摘したように、現在の答えは、間違っています。

1は、MySQL 5.6、またはONLY_FULL_GROUP_BYでMySQL 5.7を使用している場合は、正しい(決定論)クエリがあります:

SELECT incomingEmails.*
  FROM (
    SELECT fromEmail, MAX(timestamp) `timestamp`
    FROM incomingEmails
    GROUP BY fromEmail
  ) filtered_incomingEmails
  JOIN incomingEmails USING (fromEmail, timestamp)
GROUP BY fromEmail, timestamp

効率的に実行するクエリのためには、適切なインデックス付けが必要とされます。

簡素化のために、私はほとんどの場合、使用されることはありませんLOWER()を、削除したことに注意してください。

SQL標準によれば、あなたは、selectリスト内の非集計列を使用することはできません。 MySQLは、そのような使用を可能にする(uless ONLY_FULL_GROUP_BYモードを使用)が、結果は予測不可能である。

ONLY_FULL_GROUP_BYする

あなたは最初の2番目のクエリ(またはサブクエリ)で、その後fromEmail、MIN(読み取り)を選択し、必要がある - 。件名

私は、サブクエリのアプローチは関係なく、私が着るものをインデックス恐ろしくineficientだったので、示されたものよりもより複雑なクエリのためのこれらのアプローチの両方に苦労し、私は外得ることができなかったので、

休止状態を通じて自己参加します

これを行うための最善の(かつ簡単な)方法は、あなたが必要なフィールドの連結を含むように構築され、その後、SELECT句で式を使用してそれらを引き出すために何かして、グループにあります。あなたがMAXを行う必要がある場合は()フィールドは、上が連結事業体の最も重要な終わりに常にMAX()したいことを確認してください。

これを理解する鍵は)これらの他のフィールドはマックス(満たす任意のエンティティに対して不変である場合、クエリにのみ意味をなすことができるということですので、ソートの面で連結の他の部分を無視することができます。これは、このリンクの一番下にこれを行う方法について説明します。 http://dev.mysql.com/doc /refman/5.0/en/group-by-hidden-columns.htmlする

あなたは、インデックス、それとクエリを早くすることによりグループはあなたが実際に望んでいただけ、フィールド上であるかのようになりますできるフィールドの事前計算連結する(トリガーのような)午前挿入/更新イベントを得ることができる場合MAXに()。あなたも、複数のフィールドの最大値を得るためにそれを使用することができます。私は、ネストされたセットとしてexpresssed多次元木に対してクエリを行うには、それを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top