2013-02-20 84 views
0

一个(据说)简单的更新结果并不那么简单。无论我从其他回答问题,尝试这句法,我从MySQL获得相同的响应:(S)MySQL加入更新

0行受影响的行匹配:124:0的警告:0

尝试1:

UPDATE news_content, news_map 
SET news_content.active='no' 
WHERE news_content.rowID = news_map.newsID 
AND news_map.catID = 170; 

尝试2:

UPDATE news_content 
LEFT JOIN 
    news_map 
ON  news_map.newsID = news_content.rowID 
SET  news_content.active = 'no' 
WHERE news_map.catID = 170; 

尝试3:

UPDATE 
news_content nc JOIN 
news_map nm 
    ON nm.newsID = nc.rowID 
    AND nm.catID = 170 
SET nc.active = 'no'; 

您认为哪些方法可行?

+0

所有的语法都应该正常工作。你可以提供样本记录吗?再次检查值。 – 2013-02-20 13:36:01

+0

'SELECT COUNT(*)FROM news_content nc JOIN news_map nm ON nm.newsID = nc.rowID WHERE nm.catID = 170 AND(nc.active <>'no'OR nc.active IS NULL);'返回? – 2013-02-20 15:36:47

+0

@ypercube,它返回19 – walkerspace 2013-02-20 16:30:10

回答

0

是否有这个返回任何行:

select * 
from news_content 
LEFT JOIN 
    news_map 
ON  news_map.newsID = news_content.rowID 
WHERE news_map.catID = 170 
+0

我认为这应该是一个评论':)' – 2013-02-20 13:39:33

+0

@JW。是的),但如何添加评论而不是答案? – shibormot 2013-02-20 13:41:31

+0

是的,它返回124行。 – walkerspace 2013-02-20 14:29:54

1

可能是一个愚蠢的问题,但确实已经news_content.active等于“不”?

+0

有105'不'和19'是'。 – walkerspace 2013-02-20 14:30:56

+0

最可能的原因。要更新的行已经有'active ='no''(与其他DBMS相比,MySQL不会检查)。 – 2013-02-20 16:15:43

0

试试这个:

UPDATE news_content 
SET active='no' 
WHERE rowID IN (SELECT m.newsID FROM news_map m WHERE m.catID = 170); 

我更喜欢使用子查询,而不是JOIN上更新,一般来说,因为它是一个比较标准的方式。