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

Php 使用PDOs使用另一个表中的值更新MySQL行,php,mysql,sql,sql-update,Php,Mysql,Sql,Sql Update,我有一个类似下面的表格,目前没有评级、lib_id或投票的值 库 id | title | year | rating | votes | lib_id | --------------------------------------------- 1 | book1 | 1999 | | | | 2 | book2 | 2010 | | | | 3 | book3 | 2009 | |

我有一个类似下面的表格,目前没有
评级
lib_id
投票
的值

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 |        |        |        |
库表中的条目可能不会出现在分类表中,反之亦然。书的标题也可能不是唯一的。因此,我要做的是遍历库表中的每一行,取
标题
年份
列,转到
分类
表,找到具有这两个值的行,检索相应的
评级
投票
lib_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的新手,已经为这个问题挣扎了一段时间。

您也可以在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);

谢谢你的回答。不幸的是,这似乎对我不起作用。当我运行查询时,它会一直运行。我在10分钟后停止了脚本,表没有任何变化。也许我应该提到我的库表是9000行,分类表大约是260000行。这会对查询产生影响吗?@garethdn它正在工作,但执行的
全表扫描却很糟糕。您需要在列上添加索引,请稍候,我将更新答案:)如果索引没有提高性能,请提供一些反馈。效果很好,查询现在只需要大约2秒钟。再次感谢如果您想在一个SQL查询中执行此操作,而不需要编码和在行上循环,那么您肯定不需要
运算符,因为它只用于绑定应用程序逻辑中的值,而不是数据库中的值。