2014-03-25 178 views
0

繼分貝結構:包含具有ID,名稱,標題,頁數等
表cms_pages包含具有cms_page_id和秩
(超過cms_page_id唯一索引秩)

表cms_pagerows Pagerows應該包含cols,這些cols又包含...內容。
ON DUPLICATE KEY:歧義

我現在想要在現有頁面上使用php在cms_pagerows中插入新的pagerow。
由於刪除舊的頁眉,等級不一定是連續的數字。
對於這一點,我有一個函數insertRowAt($ PAGE_NAME,$偏移)具有以下SQL:

INSERT INTO `cms_pagerows` (`cms_page_id`, `rank`) 
SELECT `cms_pages`.`id`, `cms_pagerows`.`rank` + 1 
FROM `cms_pages`, `cms_pagerows` 
WHERE `cms_pages`.`name` = "'.$page_name.'" 
AND `cms_pagerows`.`cms_page_id` = `cms_pages`.`id` 
ORDER BY `rank` DESC 
LIMIT 0, "'.$offset.'" 
ON DUPLICATE KEY UPDATE `cms_pagerows`.`rank` = `cms_pagerows`.`rank` + 1 

當試圖運行它,我得到以下錯誤信息:「列cms_pagerows.rank「在字段列表不明確」

回答

0

,關鍵是要始終使用表別名來澄清對列:

INSERT INTO `cms_pagerows`(`cms_page_id`, `rank`) 
    SELECT p.`id`, pr.`rank` + 1 
    FROM `cms_pages` p join 
     `cms_pagerows` pr 
      on pr.`cms_page_id` = p.`id` 
    WHERE p.`name` = "'.$page_name.'" 
    ORDER BY pr.`rank` DESC 
    LIMIT 0, "'.$offset.'" 
    ON DUPLICATE KEY UPDATE `rank` = pr.`rank` + 1; 

你也可以說:

ON DUPLICATE KEY UPDATE `rank` = VALUES(`rank`) 

這工作,因爲select已經將插入正確的排名,所以你可以使用該值。

0

試試這個..

INSERT INTO `cms_pagerows` (`cms_page_id`, `rank`) 
SELECT `cms_pages`.`id`, `cms_pagerows`.`rank` + 1 AS rank1 
FROM `cms_pages`, `cms_pagerows` 
WHERE `cms_pages`.`name` = "'.$page_name.'" 
AND `cms_pagerows`.`cms_page_id` = `cms_pages`.`id` 
ORDER BY rank1 DESC 
LIMIT 0, "'.$offset.'" 
ON DUPLICATE KEY UPDATE `rank` = rank1 + 1 

2個rank領域是衝突的,因爲使用的是相同的名稱...使用關鍵詞..