2012-03-01 28 views
0

私は2つのテーブルを持っています。これは、日付に基づいて最後の10個のアクティブなプロジェクトIDを取得する必要があります。クエリは次のとおりです。MySQLグループby組合#1064エラー

(
SELECT project_posts.projectid as projectId, `project_posts`.`date` as rowDate 
FROM `project_posts` ORDER BY `project_posts`.id DESC 
) 
UNION ALL 
(SELECT `project_comments`.projectid as projectId, project_comments.`date` as rowDate FROM `project_comments` ORDER BY `project_comments`.id DESC) GROUP BY projectId ORDER BY rowDate DESC LIMIT 10 

そして、私はrowDate DESC(最後のプロジェクトを最初に)でソートします。問題は、私は、MySQLでグループを追加するときにということであると言う:

 
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use 
near 'GROUP BY projectId ORDER BY rowDate DESC LIMIT 6' at line 9 

私は労働組合、労働組合のすべてのグループによると問題のためにインターネット上に見えたが、私は、任意の解決策を見つけることができませんでした。 ありがとうございます。

答えて

4

私はあなたがそれのグループのことができます前に、あなたのユニオンクエリから派生テーブルを作成する必要があると思う - 私はこれを試してみる機会がなかったが、それはあなたが後にしている何をすべき

SELECT projectId, MAX(rowDate) AS rowDate 
FROM (
    (
     SELECT project_posts.projectid as projectId, `project_posts`.`date` as rowDate 
     FROM `project_posts` 
    ) UNION ALL (
     SELECT `project_comments`.projectid as projectId, project_comments.`date` as rowDate 
     FROM `project_comments` 
    ) 
) AS tmp 
GROUP BY projectId 
ORDER BY rowDate DESC 
LIMIT 10 

-

SELECT p.id, GREATEST(IFNULL(MAX(pc.date), 0), IFNULL(MAX(pp.date), 0)) AS max_date 
FROM projects p 
LEFT JOIN project_comments pc 
    ON p.id = pc.projectid 
LEFT JOIN project_posts pp 
    ON p.id = pp.projectid 
GROUP BY p.id 
ORDER BY max_date DESC 
LIMIT 10 

UPDATEはUNIONベースのクエリは、この2番目のクエリよりもはるかに高速でなければなりません。私はいくつかのダミーデータ(100kプロジェクト、200k投稿、および700kコメント)を使用していくつかの原油テストを行い、マルチ結合クエリはUNIONクエリの3〜5倍の時間がかかります。

+0

ご返信ありがとうございます。クエリは実行されますが、並べ替えが正しいとは限りません。最後のプロジェクトIDを取ることはありません(日付DESCで並べられた両方のタルブに対して別々の選択を実行すると異なります)。私は、ORDER BYの 'project_comments''''date'' DESCと' project_posts'''date' DESCを使って、(UNION内の)すべてのselectでORDER BY句を変更しようとしましたが、まだここにあります。なにか提案を?前もって感謝します。 – some12die4

+0

元の投稿をもう一度読みました。最終目標は何で、テーブル構造は何ですか?私はUNIONを使ってこのクエリを実行するのが最良の方法だとは思わない。 – nnichols

+0

誤解をおかけして申し訳ありません。私は彼らの活動(投稿とコメント)に基づいて、最後の10のアクティブなプロジェクトを手に入れたいと思います。私は組合とは違う方法を見つけられませんでした。 – some12die4