0

以下のようなテーブルがありますが、現在、、またはの値はありratingませlib_idvotes

図書館

id | title | year | rating | votes  | lib_id |
---------------------------------------------
1  | book1 | 1999 |        |        |       |
2  | book2 | 2010 |        |        |       |
3  | book3 | 2009 |        |        |       |
4  | book4 | 2007 |        |        |       |
5  | book5 | 1987 |        |        |       |

次に、次のような分類テーブルがあります。

分類

id   | title   | year | rating | votes  | lib_id |
---------------------------------------------
108  | book154 | 1929 |        |        |        |
322  | book23  | 2011 |        |        |        |
311  | book3   | 2009 |  9.3   |  4056  |  10876 |
642  | book444 | 2001 |        |        |        |
533  | book567 | 1981 |        |        |        |

ライブラリテーブルのエントリが分類テーブルに表示されない場合や、その逆の場合があります。また、本のタイトルが一意でない可能性もあります。したがって、私がやりたいのは、ライブラリテーブルの各行を調べ、列titleと列を取得yearし、テーブルに移動しclassificationsてこれら2つの値を持つ行を見つけ、対応する列と列を取得ratingvoteslib_id、ライブラリテーブルのエントリを更新することです。

PDOも使いたいです。以下は、私が達成しようとしていることの機能しない例です。

$update_vals_STH = 
$DBH->prepare(
   "UPDATE library SET lib_id=?, rating=?, votes=? 
    FROM (SELECT lib_id, rating, votes) 
    FROM classifications WHERE title=? AND year=?"; 

どんな助けでもいただければ幸いです。私はMySQLにまったく慣れておらず、しばらくの間これに苦労しています。

4

1 に答える 1

1

updateステートメントでテーブルを結合することもできます。

UPDATE  library a
        INNER JOIN classifications b
            ON  a.title = b.title AND
                a.year = b.year
SET     a.rating = b.rating,
        a.votes = b.votes,
        a.lib_id = b.lib_id
// WHERE    clause                   // if you want to have extra condition.

アップデート

パフォーマンスを向上させるには、次のフィールドにインデックスを追加する必要があります。

ALTER TABLE library ADD INDEX (title, year);
ALTER TABLE classifications ADD INDEX (title, year);
于 2013-01-26T11:34:18.617 に答える