1

サブクエリ内の複数の列からのデータを使用して、行内の複数の列を更新しようとしています。

次のアプローチはうまくいきませんでした。自分のニーズに合った別のアプローチが見つかりません。

UPDATE
    beers,
    (SELECT AVG(appearance) AS appearance, AVG(palate) AS palate, AVG(taste) AS taste, AVG(aroma) AS aroma, AVG(overall) AS overall, beer_id FROM reviews) AS review_total
SET
    beers.appearance = review_total.appearance, 
    beers.palate = review_total.palate, 
    beers.taste = review_total.taste, 
    beers.aroma = review_total.aroma, 
    beers.overall = review_total.overall
WHERE
    review_total.beer_id = beers.id
AND
    beers.id = 43

これについてはエラーは発生しませんが、5 つの警告と行が更新されません。

Query OK, 0 rows affected, 5 warnings (0.01 sec)

警告を表示すると、次のようになります。

+-------+------+----------------------------------------------------+
| Level | Code | Message                                            |
+-------+------+----------------------------------------------------+
| Note  | 1265 | Data truncated for column 'appearance' at row 9991 |
| Note  | 1265 | Data truncated for column 'palate' at row 9991     |
| Note  | 1265 | Data truncated for column 'taste' at row 9991      |
| Note  | 1265 | Data truncated for column 'aroma' at row 9991      |
| Note  | 1265 | Data truncated for column 'overall' at row 9991    |
+-------+------+----------------------------------------------------+

この問題はデータ型に関係していることはわかっていますが、データ型は float です。それが AVG の結果でもあると思います。

mysql> describe beers;
+-------------+---------------+------+-----+---------+----------------+
| Field       | Type          | Null | Key | Default | Extra          |
+-------------+---------------+------+-----+---------+----------------+
| id          | int(11)       | NO   | PRI | NULL    | auto_increment |
| name        | varchar(90)   | YES  |     | NULL    |                |
| aroma       | float         | YES  |     | NULL    |                |
| appearance  | float         | YES  |     | NULL    |                |
| palate      | float         | YES  |     | NULL    |                |
| taste       | float         | YES  |     | NULL    |                |
| overall     | float         | YES  |     | NULL    |                |
+-------------+---------------+------+-----+---------+----------------+

次のクエリは少し異なります。

UPDATE
    beers
SET
    beers.appearance = review_total.appearance, 
    beers.palate = review_total.palate, 
    beers.taste = review_total.taste, 
    beers.aroma = review_total.aroma, 
    beers.overall = review_total.overall
FROM
    INNER JOIN (SELECT AVG(appearance) AS appearance, AVG(palate) AS palate, AVG(taste) AS taste, AVG(aroma) AS aroma, AVG(overall) AS overall, beer_id FROM reviews) review_total ON review_total.beer_id = beers.id
WHERE
    beers.id = 43

このエラーは次のとおりです。

ERROR 1064 (42000): 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 'FROM INNER JOIN (SELECT AVG(appearance) AS appearance, AVG(palate) AS palate, AV' at line 9

これを機能させる方法が本当に見つかりません。誰かが私が間違っていることを理解してくれることを願っています。事前にどうもありがとうございました!

4

1 に答える 1

2
  UPDATE beers b
    JOIN 
       ( SELECT beer_id
              , AVG(appearance) appearance
              , AVG(palate) palate
              , AVG(taste) taste
              , AVG(aroma) aroma
              , AVG(overall) overall
              , beer_id 
           FROM reviews
          GROUP
             BY beer_id
       ) review_total 
      ON review_total.beer_id = b.id
     SET b.appearance = review_total.appearance
       , b.palate = review_total.palate
       , b.taste = review_total.taste
       , b.aroma = review_total.aroma
       , b.overall = review_total.overall
   WHERE b.id = 43;

またはそのようなもの

于 2013-03-21T11:11:51.970 に答える