私の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の問題を解決する方法を誰かが知っているとうれしいでしょう。
ため最大と最小を使用し、内側を使用することができます。あなたは私が推測する通りにこのようにする必要があります。しかし、私はそれが起こるかどうかを見たいと思う。 – FallAndLearn