使用PDO使用另一个表中的值更新MySQL行

时间:2013-01-26 11:30:16

标签: php mysql sql sql-update

我有一个类似下面的表,目前没有ratinglib_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 |        |        |        |

可能会发生库表中的条目可能不会出现在分类表中,反之亦然。书的标题也可能不是唯一的。所以我想要做的是遍历库表中的每一行,取titleyear列,转到classifications表,找到具有这两个值的行,检索相应的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很陌生,并且一直在努力解决这个问题。

1 个答案:

答案 0 :(得分:1)

您也可以在更新语句上连接表。

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);