1

我可以这样做来更新一行吗?这是我第一次使用 aLEFT JOINUPDATE.

UPDATE comments AS r

LEFT JOIN items AS i 
        ON i.items_id = r.item_id
LEFT JOIN master_cat AS c
        ON c.cat_id = i.items_id  
SET r.good = r.good + 1 
WHERE i.item = '{$item}' AND c.category = '{$cat}' AND r.review = '{$review}';

它不会引发错误,但它会说 0 行受到影响,即使我已经确认我的变量可以使用正确的数据。(即使我对数据进行硬编码)。

编辑:我也尝试过内部连接,但也不起作用。

编辑 2:这实际上是我想要做的,我有这两个 queires,它们工作正常。我正在尝试将代码简化为一个。可以这样做:

     // This query returns rate_id which I use as "$review_id" in the second query.

     $query = "
     SELECT r.rate_id
     FROM comments as r
     LEFT JOIN items AS i 
         ON i.items_id = r.item_id
     LEFT JOIN master_cat AS c
         ON c.cat_id = i.cat_id
     WHERE r.review = '{$review}' 
        AND i.item = '{$item}' 
        AND c.category = '{$cat}';"; 

    $query = "
    UPDATE comments 
    SET good = good + 1 
    WHERE rate_id = '{$review_id}';";
4

3 回答 3

3

如果您要对表 c 进行外部联接,然后在表 c 中的字段上有一个 where 子句,那么您实际上就有了一个内部联接,因为如果联接条件未命中,where 子句将不匹配任何内容。

于 2013-02-06T16:55:48.787 回答
3

你为什么想做一个LEFT JOIN?您没有使用连接表中的任何列来更新行...所以我假设连接表的目的是将要递增的行限制comments为仅在关联的表。

您受到 0 行影响的原因是您在WHERE子句中为左连接表放置了附加条件,这实际上是将每个表都LEFT JOIN变成了INNER JOIN.

假设这是您的查询的简化版本,并且您有其他原因想要使用LEFT JOIN,您可以通过将条件移动到您的ON子句中来解决此问题:

UPDATE comments AS r
    LEFT JOIN items AS i 
        ON i.items_id = r.item_id
        AND i.item = '{$item}' 
    LEFT JOIN master_cat AS c
        ON c.cat_id = i.items_id  
        AND c.category = '{$cat}' 
SET r.good = r.good + 1 
WHERE r.review = '{$review}';
于 2013-02-06T16:56:03.330 回答
2

您的问题是在UPDATE语句中您有一个不匹配的连接(cat_idwith items_id):

LEFT JOIN master_cat AS c
        ON c.cat_id = i.items_id  

SELECT(正在工作的)中,您可以正确地加入:

LEFT JOIN master_cat AS c
        ON c.cat_id = i.cat_id
于 2013-02-06T21:00:49.557 回答