php - 重复 key : Ambiguous

标签 php mysql sql

以下数据库结构:
表 cms_pages 包含带有 id、名称、标题等的页面
表 cms_pagerows 包含具有 cms_page_id 和排名的行
(cms_page_id 上的唯一索引,排名)
页行应该包含列,而列又包含...内容。

我现在想使用 php 将新页面行插入到现有页面上的 cms_pagerows 中。
由于删除了旧页行,排名不一定是连续的数字。
为此,我有一个带有以下 SQL 的函数 insertRowAt($page_name, $offset):

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’不明确”

最佳答案

关键是始终使用表别名来消除列的歧义:

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已经要插入正确的排名,所以您可以只使用该值。

关于php - 重复 key : Ambiguous,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22634350/

相关文章:

php - Multi-Tenancy 多数据库设置

插入文本时出现 MySQL 错误 1292

Python/SQLAlchemy - 如何使用多个 WHERE 子句快速查询数据库?

PHPMyAdmin 未创建关系

mysql - sql匹配模式正则表达式查询

sql - "ORA-22812: cannot reference nested table column' s 存储表”尝试访问系统表时

php - ob_start https 和 http 之间的区别?

PHP XMPP 机器人性能

php - 这段代码实际上做了什么?

mysql - laravel 中的查询优化