2012-02-08 28 views
0

サブクエリを使用してMySQLクエリの選択結果をGROUP BYで順序付けることは可能ですか?大きなデータセットでは、サブクエリがクエリにかなりの量の読み込み時間を追加することがわかりました。ここで MySQLがグループを結合し、グループ化し、選択肢をグループ化する

は似たような状況である:これは動作します私のコードです how to sort order of LEFT JOIN in SQL query?

が、それは、負荷への道がかかりすぎる:

SELECT tags.contact_id, n.last 
FROM tags 
LEFT JOIN (SELECT * FROM names ORDER BY timestamp DESC) n 
ON (n.contact_id=tags.contact_id) 
WHERE tags.tag='$tag' 
GROUP BY tags.contact_id 
ORDER BY n.last ASC; 

私は単純なwが参加やっ速い結果を得ることができます/テーブル名ですが、 "group by"コマンドは、最後の行ではなく、結合されたテーブルの最初の行を返します。

+0

1 。)注文に使用されたフィールドにはインデックスがありますか? 2)インデックスの反対方向に注文した場合、インデックスは遅くなりますので、インデックスがそれぞれの場合に昇順または降順になるように慎重に選択してください。 – Alfabravo

答えて

1

私はあなたが何をしようとしているのか分かりません。 n.lastを選択

  • 、それはどちらもgroup by句、また集計値ではありませんが:ここではあなたのクエリに伴う問題の一部です。 MySQLはこれを許していますが、実際にはそれを利用することはお勧めできません。
  • が不ちょうどサブクエリは本当に私は慎重すなわち、目的のクエリ結果を書き留めることをお勧め何

をやっていない

  • に参加するのではなく、参加する前にテーブルを並べ替える「私は連絡先IDをしたいと各タグの最新の日付 "またはそれに類するもの。これは、あなたがOPで示したものよりも効率的で、自然で、書きやすく、意味的に正しいクエリにつながる可能性があります。

    が質問に答えるために「それはGROUP BYクエリを注文することが可能である」:はい、それはここでは非常に簡単だし、です例:あなたはLEFTを行っている

    select a, b, sum(c) as `c sum` 
    from <table_name> 
    group by a,b 
    order by `c sum` 
    
  • +0

    "グループ化"を実行すると、 。それは行を折りたたむとき、それらの行のいずれかから情報を保持します - 私の場合、それが保持するデフォルトの行は私が望むものではありません。 – swt83

    +2

    @ swt83あなたは 'group by'の仕組みを誤解しています。**正しく使用していないと、予期せぬ、欲求不満な結果につながります!**それを読んで、' max'や ' 「分」。 –

    +0

    これは私の最初の経験で、ジョイントなどで - 私は学びたいと思っています。それ以上の読書であなたは正しいです、私はこれを悪用しています。ありがとう。 – swt83

    0

    は、コンタクトIDに登録しようこれは、名前テーブルに一致するものを見つけるのとは関係なく、すべてのタグ連絡先が必要であることを意味します。本当にそうですか、タグテーブルには常に「名前」連絡先IDレコードがありますか?さらに、あなたの列 "n.Last"。この人の姓、または前回の何かが言われていること、だから... ...(タイムスタンプは実際に私が引き受けるもの)

    に行われ、私は直接の単純結合だけを行うだろう

    SELECT DISTINCT 
         t.contact_id, 
         n.last 
        FROM 
         tags t 
         JOIN names n 
          ON t.contact_id = n.contact_id 
        WHERE 
         t.tag = '$tag' 
        ORDER BY 
         n.last ASC 
    
    関連する問題