2012-04-08 140 views
0

在簡單的我嘗試這樣做在phpMyAdmin:MySQL查詢0行受到影響

更新wp_postmeta.meta_value = wp_posts.id其中

wp_posts.post_name = articles.image

和wp_posts。 post_type =附件

AND wp_postmeta.meta_key = _thumbnail_id

這個MySQL查詢:

update wp_postmeta m 
join articles a on (m.post_id = a.id) 
join wp_posts p on (m.post_id = p.ID) 
set m.meta_value = p.ID 
where p.post_name=a.image 
AND a.image != NULL 
AND p.post_type='attachment' 
AND m.meta_key='_thumbnail_id' 

它的工作,但0行受到影響! 任何人都可以幫忙?

+1

幫助什麼?沒有這樣的行,所以沒有更新 – zerkms 2012-04-08 10:04:05

回答

1

在Andomar的答案中使用子查詢。與更新和刪除語句聯合使用並不好。

它應該是這樣的

UPDATE wp_postmeta m SET m.meta_value = (SELECT p.ID FROM wp_posts p, articles a 
WHERE m.post_id=p.ID AND m.post_id = a.id AND a.image IS NOT NULL 
    AND p.post_type='attachment' AND p.post_name=a.image) 
WHERE m.meta_key='_thumbnail_id' 

先備份!我沒有測試這個。

如果不行,請嘗試執行選擇查詢,如果您可以選擇它們。如果沒有選擇(可能不會),請檢查與您的設計相對應的查詢結構。

SELECT m.meta_value, (SELECT p.ID FROM wp_posts p, articles a 
WHERE m.post_id=p.ID AND m.post_id = a.id AND a.image IS NOT NULL 
    AND p.post_type='attachment' AND p.post_name=a.image) AS pID 
FROM wp_postmeta m 
WHERE m.meta_key='_thumbnail_id' 

也可以嘗試第一個查詢過

SELECT m.meta_value, p.ID AS pID FROM wp_postmeta m 
INNER JOIN articles a on (m.post_id = a.id) 
INNER JOIN wp_posts p on (m.post_id = p.ID) 
WHERE p.post_name=a.image 
AND a.image IS NOT NULL 
AND p.post_type='attachment' 
AND m.meta_key='_thumbnail_id' 

嘗試播放/修改選擇查詢,找出問題。

+1

編號MySQL在更新和刪除語句中連接沒有問題。 – 2012-04-08 10:17:09

+0

它仍然反對邏輯。當你選擇你使用連接的東西時,你會得到一個結果集合。當您使用更新或刪除如果您使用連接和合並表,結果仍將單獨應用於表。子查詢仍然更好,即使DBMS支持jins,它對於人的可讀性也更好,不會犯錯誤並且可移植。 – 2012-04-08 10:20:07

+0

你是對的,你必須確保從表中選擇一行來刪除或更新。儘管MySQL在Update/Delete語句的WHERE條件中存在一些限制(不在你的例子中,這很好)。還有性能問題。所以,通常使用連接 - 使用MySQL。 – 2012-04-08 10:22:35

1

本聲明:

AND a.image != NULL 

始終計算爲unknownwhere子句過濾掉不是true的行。因此,where可以篩選出unknownfalse。試試這個:

AND a.image is not null 

請參閱this wikipedia article瞭解更多信息。

+0

給了我相同的結果! – 2012-04-08 10:07:15

+1

在這種情況下,您可以發佈一些您希望查詢生成結果的示例數據嗎? – Andomar 2012-04-08 10:08:03