0

我有一张像下面这样的表,目前没有rating,lib_id或的值votes

图书馆

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表并找到具有这两个值的行,检索相应的rating,voteslib_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  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 回答