简体   繁体   中英

Updating MySQL row with values from another table using PDOs

I have a table like the one below that currently has no values for rating , lib_id or votes .

library

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

I then have the classifications table which looks like this.

classifications

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

It can happen that entries in the library table may not appear in the classifications table and vice-versa. There can also be the possibility that the title of the book is not unique. So what I want to do is go through each row in the library table, take the title and year columns, go to the classifications table and find the row that has these two values, retrieve the corresponding rating , votes and lib_id columns and update the entry in the library table.

I also want to use PDOs. Below is a non-working example of what i'm trying to achieve.

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

Any help would be appreciated. I'm quite new to MySQL and have been struggling with this one for a while.

You can join tables on update statement too.

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.

UPDATE

For better performance, you need to add indexes on the following field.

ALTER TABLE library ADD INDEX (title, year);
ALTER TABLE classifications ADD INDEX (title, year);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM