72

誰かが以下のクエリの何が問題になっているのかわかりますか?

実行すると、次のようになります。

#1064-SQL構文にエラーがあります。8行目の「a.CompetitionID=Competition.CompetitionID」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

Update Competition
Set Competition.NumberOfTeams =
(
SELECT count(*) as NumberOfTeams
FROM PicksPoints
where UserCompetitionID is not NULL
group by CompetitionID
) a
where a.CompetitionID =  Competition.CompetitionID
4

4 に答える 4

171

主な問題は、内部サブクエリが実行される前に、更新されるテーブルにwhereフィルタが最初に適用されるため、内部クエリをwhere外部ステートメントの句に関連付けることができないことです。updateこのような状況を処理する一般的な方法は、マルチテーブルの更新です。

Update
  Competition as C
  inner join (
    select CompetitionId, count(*) as NumberOfTeams
    from PicksPoints as p
    where UserCompetitionID is not NULL
    group by CompetitionID
  ) as A on C.CompetitionID = A.CompetitionID
set C.NumberOfTeams = A.NumberOfTeams

デモ:http ://www.sqlfiddle.com/#!2 / a74f3 / 1

于 2012-07-21T01:24:43.747 に答える
23

おかげで、私はINNERJOINで更新するという考えを持っていませんでした。

元のクエリでは、サブクエリに名前を付けるのが間違っていました。サブクエリは値を返す必要があるため、エイリアスを作成できません。

UPDATE Competition
SET Competition.NumberOfTeams =
(SELECT count(*) -- no column alias
  FROM PicksPoints
  WHERE UserCompetitionID is not NULL
  -- put the join condition INSIDE the subquery :
  AND CompetitionID =  Competition.CompetitionID
  group by CompetitionID
) -- no table alias

競争のすべての記録のためのトリックを行う必要があります。

注目される:

効果は、対応するPickPointがないコンペティションレコードを更新しないmellamokbによって提案されたクエリとまったく同じではありません。

SELECT id, COUNT(*) GROUP BY idIDの既存の値のみがカウントされるため、

一方、aSELECT COUNT(*)は常に値を返し、レコードが選択されていない場合は0になります。

これはあなたにとって問題かもしれないし、そうでないかもしれません。

0対応バージョンのmellamokbクエリは次のようになります。

Update Competition as C
LEFT join (
  select CompetitionId, count(*) as NumberOfTeams
  from PicksPoints as p
  where UserCompetitionID is not NULL
  group by CompetitionID
) as A on C.CompetitionID = A.CompetitionID
set C.NumberOfTeams = IFNULL(A.NumberOfTeams, 0)

つまり、対応するPickPointが見つからない場合は、Competition.NumberOfTeamsをゼロに設定します。

于 2013-09-04T12:37:50.743 に答える
15

せっかちな人のために:

UPDATE target AS t
INNER JOIN (
  SELECT s.id, COUNT(*) AS count
  FROM source_grouped AS s
  -- WHERE s.custom_condition IS (true)
  GROUP BY s.id
) AS aggregate ON aggregate.id = t.id
SET t.count = aggregate.count

これが@mellamokbの答えであり、上記のように、最大​​値に減らされています。

于 2016-01-16T05:53:13.183 に答える
0

eav_attributesテーブルをチェックして、次のような各イメージロールに関連する属性IDを見つけることができます。 eav_attributes

次に、それらを使用して、そのようなすべての製品のいずれかの役割を他の役割に設定できます。

UPDATE catalog_product_entity_varchar AS `v` INNER JOIN (SELECT `value`,`entity_id` FROM `catalog_product_entity_varchar` WHERE `attribute_id`=86) AS `j` ON `j`.`entity_id`=`v`.entity_id SET `v`.`value`=j.`value` WHERE `v`.attribute_id = 85 AND `v`.`entity_id`=`j`.`entity_id`

上記は、すべての「ベース」ロールを同じ製品の「小さな」イメージに設定します。

于 2021-01-08T15:59:42.660 に答える