2016-11-26 10 views
3

私のFlarumフォーラムを手動でデータベースに登録した後、そのディスカッションレコードを更新したいと考えています。 (Flarumはまだベータ版であり、まだ多くの機能が欠けている、手動で物事を固定行うことはそれは珍しいことではありません。)私は私が望んでい次のクエリ構成する管理:UPDATEステートメントで複数のサブクエリを簡略化

UPDATE discussions as d SET 
    d.start_time = 
    (SELECT min(p.time) FROM posts as p 
     WHERE p.discussion_id = d.id), 
    d.last_time = 
    (SELECT max(p.time) FROM posts as p 
     WHERE p.discussion_id = d.id), 
    d.comments_count = 
    (SELECT count(*) FROM posts as p 
     WHERE p.discussion_id = d.id AND p.type = 'comment'), 
    d.participants_count = 
    (SELECT count(DISTINCT p.user_id) FROM posts as p 
     WHERE p.discussion_id = d.id), 
    d.start_post_id = 
    (SELECT p.id FROM posts as p 
     WHERE p.discussion_id = d.id 
     ORDER BY p.number ASC LIMIT 1), 
    d.start_user_id = 
    (SELECT p.user_id FROM posts as p 
     WHERE p.discussion_id = d.id 
     ORDER BY p.number ASC LIMIT 1), 
    d.last_post_id = 
    (SELECT p.id FROM posts as p 
     WHERE p.discussion_id = d.id 
     ORDER BY p.number DESC LIMIT 1), 
    d.last_post_number = 
    (SELECT p.number FROM posts as p 
     WHERE p.discussion_id = d.id 
     ORDER BY p.number DESC LIMIT 1), 
    d.last_user_id = 
    (SELECT p.user_id FROM posts as p 
     WHERE p.discussion_id = d.id 
     ORDER BY p.number DESC LIMIT 1); 

をそれはかなり醜いです。私は同じ論理をはるかに簡潔かつ効率的な方法で書く方法があると確信していますが、私は実際にそれをやる方法を知るためのSQLではありません。誰かが、これらのほとんど重複したサブクエリを排除する方法を教えてもらえますか?

CREATE TABLE discussions (
    id     int unsigned NOT NULL AUTO_INCREMENT, 
    title    varchar(200) NOT NULL, 
    comments_count  int(10) unsigned NOT NULL DEFAULT '0', 
    participants_count int(10) unsigned NOT NULL DEFAULT '0', 
    number_index   int(10) unsigned NOT NULL DEFAULT '0', 
    start_time   datetime NOT NULL, 
    start_user_id  int(10) unsigned DEFAULT NULL, 
    start_post_id  int(10) unsigned DEFAULT NULL, 
    last_time   datetime DEFAULT NULL, 
    last_user_id   int(10) unsigned DEFAULT NULL, 
    last_post_id   int(10) unsigned DEFAULT NULL, 
    last_post_number  int(10) unsigned DEFAULT NULL, 
    ...); 

CREATE TABLE posts (
    id     int(10) unsigned NOT NULL AUTO_INCREMENT, 
    discussion_id  int(10) unsigned NOT NULL, 
    number    int(10) unsigned DEFAULT NULL, 
    time     datetime NOT NULL, 
    user_id    int(10) unsigned DEFAULT NULL, 
    type     varchar(100) DEFAULT NULL, 
    ...); 

FlarumがプライマリストレージバックエンドとしてMySQLを使用して、MySQL固有のソリューションは、微細であろうように:

上記テーブルの定義は、以下の(省略いくつかの詳細を含む)です。しかし、ANSI-SQLの問題を解決する方法を誰かが知っているとうれしいでしょう。

+0

ため最大と最小を使用し、内側を使用することができます。あなたは私が推測する通りにこのようにする必要があります。しかし、私はそれが起こるかどうかを見たいと思う。 – FallAndLearn

答えて

1

あなたが参加し、あなたが望むものに簡単な方法はありません

最初と最後の
UPDATE discussions as d 
INNER JOIN posts as p on d.id = p.discussion_id 
SET d.start_time = min(p.time), 
    d.last_time = max(p.time), 
    d.comments_count = count(*), 
    d.participants_count = count(DISTINCT p.user_id) , 
    d.start_post_id = min(p.id), 
    d.start_user_id = min(p.user_id ), 
    d.last_post_id = max( p.id), 
    d.last_post_number = max(p.number), 
    d.last_user_id = max(p.user_id ), 
    d.comments_count = sum(case when p.type = 'comment' then 1 else 0) 
GROUP BY d.id 
+0

私はそれが望むように動作しないと思う。まず、テーブル 'ディスカッション'のスキーマを変更しています – FallAndLearn

+0

私はnothingsを変更しました..私は単にSQLの機能を使用してクエリをリファクタリングしました.. OPで必要とされています – scaisEdge

+0

有望です!しかし、私は 'd.last_post_id = min(d.last_post_id)'がここでどのように動作するかを知ることができません。 MySQLの問題*「エラー:グループ機能の無効な使用」メッセージ。 – firegurafiku

関連する問題