MySQL / SQL:更新されたテーブル自体からの相関サブクエリによる更新
-
22-07-2019 - |
質問
一般的な質問があるので、例を使用して説明します。
次のフィールドを持つテーブルがあるとします:" id"、" name"、" category"、" appearances&quot ;;および「比率」
アイデアは、複数のアイテムがあり、それぞれが単一のカテゴリに関連し、「表示される」ということです。数回。比率フィールドには、カテゴリ内のアイテムの出現総数に対する各アイテムの出現割合を含める必要があります。
擬似コードでは、次のものが必要です:
-
各カテゴリについて
関連するアイテムの外観の合計を見つけます。たとえば、(select sum(" appearances")from table group by category
) -
各アイテムごと
比率値は、アイテムの外観を上記のカテゴリで見つかった合計で割った値として設定します
現在、1つの更新クエリでこれを達成しようとしていますが、実行できないようです。私がすべきだと思ったのは:
update Table T
set T.ratio = T.appearances /
(
select sum(S.appearances)
from Table S
where S.id = T.id
)
しかし、MySQLは更新列のエイリアスTを受け入れません。これを達成する他の方法は見つかりませんでした。
アイデアはありますか
解決
受け取った2つの回答(いずれも完全ではなかったため、独自に作成しました)に従って、最終的に次のようになりました。
UPDATE Table AS target
INNER JOIN
(
select category, appearances_sum
from Table T inner join (
select category as cat, sum(appearances) as appearances_sum
from Table
group by cat
) as agg
where T.category = agg.cat
group by category
) as source
ON target.category = source.category
SET target.probability = target.appearances / source.appearances_sum
非常に迅速に動作します。相関サブクエリも試しましたが、はるかに遅いため(桁違いに)、結合に固執しています。
他のヒント
更新直後に結合を使用する: リファレンスマニュアル– 13.2.11 UPDATE構文
so ...でtable1内部結合table2を更新します。 table1.foo = valueを設定します ここで、table2.bla = someothervalue
こうした種類のものでは、常にマニュアルを参照してください。 MySqlには適切なリファレンスマニュアルがあるため、正しい構文を取得するのはそれほど難しくないはずです;)
これはmssqlで行われる方法です。mysqlは同じまたは類似していると思います:
create table T (id int, ratio float, appearances int)
insert T values (1, null, 2)
insert T values (1, null, 3)
update T
set ratio = cast(appearances as float)/ agg.appearancesSum
from T join (
select id, sum(appearances) as appearancesSum
from T
group by id
) as agg on t.id = agg.id