【问题标题】:avoid duplicates in mysql relations table避免 mysql 关系表中的重复项
【发布时间】:2014-03-03 08:06:17
【问题描述】:

我有一张如下所示的表格:

CREATE TABLE `relations` (
   `idA` VARCHAR(20),
   `idB` VARCHAR(20).
   PRIMARY KEY (idA,idB)
)
TYPE=MyISAM;

它基本上只是将另一个表中的两个 id 映射在一起,如下所示:

CREATE TABLE `scores` (
   `id` VARCHAR(20) PRIMARY KEY,
   `score` INT(10) UNSIGNED NOT NULL DEFAULT ‘0’,
   `friendsids` VARCHAR(1000)

)
TYPE=MyISAM;

所以 - 如果我想在关系表中添加一些东西,我会查询

INSERT IGNORE INTO relations VALUES ('$idA', '$idB')

所以问题 - 它有时会创建具有相同信息但在 idA 和 idB 之间交换的条目。例如,如果一个条目是 idA = 1, idB = 2 - 我不想要一个看起来像 idA = 2, idB = 1 的条目;

我试过了:

INSERT IGNORE INTO relations VALUES ('$idA', '$idB') WHERE NOT EXISTS (SELECT * WHERE idA IS '$idB' AND idB IS '$idA');

它给了我一个我无法弄清楚的语法错误:

Query failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IGNORE INTO relations VALUES ('saubua', 'deppata') WHERE NOT EXISTS (SELECT * WH' at line 1

有没有可能我完全走错了路?有没有更简单的方法?

【问题讨论】:

  • 你能告诉我们你得到的实际错误吗?
  • 您已经在 where 子句中指定了列名,并在第二次选择之前使用了 IN
  • @TaryEast:刚刚编辑了帖子,底部有错误
  • 我会删除 1-2, 2-1 然后插入
  • @krishna: idaA 是列名,$idA 是我要添加的带有 id 的字符串。第二个 SELECT 是什么意思 - 只有一个?

标签: php mysql


【解决方案1】:

你可以试试

INSERT INTO relations
SELECT '$idA','$idB'
FROM   dual
WHERE  NOT EXISTS (SELECT idA
                   FROM   relations
                    WHERE (idA='$idA' OR idB='$idB')
                    OR (idA='$idB' OR idB='$idA')
                   )

【讨论】:

  • 我试过了,但它没有添加任何东西,除非 idB 与 idA 相同(意味着与自身的连接)。什么是双重?那是另一个数据库吗?我尝试用关系替换它。
  • 实际上,我成功了!我稍微改变了一下,所以它看起来像这样: INSERT IGNORE INTO Relations SELECT '$idA','$idB' FROM scores WHERE NOT EXISTS (SELECT idA FROM Relations WHERE (idA='$idB' AND idB='$idA ') ) 非常感谢 Akhil!
  • 伟大的工作伙伴,你为什么不把它作为答案发布
【解决方案2】:

所以 - 我拿了 Akhirs 代码并修改了它,所以它不起作用:

INSERT IGNORE INTO relations SELECT '$idA','$idB' FROM dual WHERE NOT EXISTS (SELECT idA FROM relations WHERE (idA='$idB' AND idB='$idA') )

谢谢大家!! :)

【讨论】:

    猜你喜欢
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2013-04-08
    • 2013-06-30
    相关资源
    最近更新 更多