在DUPLICATE KEY:暧昧

时间:2014-03-25 12:17:12

标签: php mysql sql

以下db结构:
表cms_pages包含带有id,name,title等的页面 表cms_pagerows包含具有cms_page_id和等级
的行 (cms_page_id上​​的唯一索引,等级)
Pagerow应该包含cols,而cols又包含...... content。

我现在想要使用php在现有页面上的cms_pagerows中插入一个新的pagerow 由于删除了旧的分页,等级不一定是连续的数字 为此,我有一个函数insertRowAt($ page_name,$ offset),带有以下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'不明确”

2 个答案:

答案 0 :(得分: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

两个rank字段存在冲突,因为您使用相同的名称...使用AS的{​​{1}}关键字..

答案 1 :(得分: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已经要插入正确的等级,所以你可以使用该值。