升级后需要帮助修复MySQL数据库中损坏的关系链接

时间:2011-03-31 19:35:28

标签: mysql

我最近升级了一个论坛数据库,但帖子没有链接到用户。查看表格,我可以看到以下内容(为简洁而缩短所有表格的示例):

jos_posts:

 Poster = Guest  (which is incorrect)
 Poster_ID = 0   (which is incorrect)
 Topic_ID = 10

jos_Topics:

 id = 10
 Poster = Ian

jos_users:

 Poster_ID = 2153
 Username = Ian

因此虽然poster_ID在jos_posts中错误地显示为0,但是Topic_ID的关系链接意味着可以找到真实的Poster,以及随后的jos_users表中的Poster_ID,并且希望更新jos_posts表。

在我看来,我需要执行以下步骤:

  1. 查看jos_posts中的每个帖子,将Topic_ID保存到变量
  2. 转到jos_topics表并搜索id,并将Poster保存到变量
  3. 转到jos_users,搜索海报并将Poster_ID保存到变量
  4. 返回jos_posts并使用收集的变量更新Poster和Poster_ID。
  5. 最后跳过一行,然后循环上面的内容,直到jos_posts表中没有更多记录。
  6. 现在我的问题:我的php / SQL编码很差,所以任何人都可以确认我的上面的逻辑是正确的,如果可能的话,指出我正确的方向写一个可以纠正jos_posts表的短程序? / p>

4 个答案:

答案 0 :(得分:1)

不需要循环,它只是两个简单的SQL语句:

update jos_posts set poster_id = (
  select u.poster_id from jos_topics t, jos_users u 
  where t.id = topic_id and t.poster = u.username);

随后更新海报栏,一切都应该没问题:

update jos_posts set poster = (
 select u.username from jos_users u where u.poster_id = poster_id);

答案 1 :(得分:0)

最好只抓取jos_posts中的所有记录并迭代它们,执行你列出的其他操作。

$posts = mysql_query("select * from jos_posts");
if($posts){
  while($post = mysql_fetch_array($posts)){
     $topic = $post['Topic_ID'];
     /* Look up the topic and get poster */
     /* Look up the user and get the id */
     $sql = "UPDATE jos_posts SET Poster = '".$poster
           ."', Poster_ID = '."$posterid"
           .' WHERE Topic_ID = '".$topic."'";
     mysql_query($sql);
  }
}

这样的事情可能会解决......根据需要添加逻辑。

答案 2 :(得分:0)

使用此查询选择所有用户及其ID。

SELECT jos_Topics.Topic_ID,jos_Topics.Poster,jos_users.Poster_ID 来自jos_Topics INNER JOIN jos_users ON jos_Topics.Poster = jos_users.Username

使用上一个查询更新jos_posts Poster_ID。

但是,我很确定您的问题是您在两个地方开始使用数据。关系数据库的重点是消除冗余。

答案 3 :(得分:0)

不完全偏离主题,我希望:

伊恩肯定能很好地描述他的问题。但是,通过一些进一步的工作,可以使用一个使问题可测试的脚本来扩充描述:

use test;

DROP TABLE IF EXISTS jos_posts;

CREATE TABLE jos_posts (
    Id INTEGER PRIMARY KEY
  , Poster VARCHAR( 20 )
  , Poster_ID INTEGER
  , Topic_ID INTEGER
);

INSERT INTO jos_posts VALUES (1, 'GUEST', 0, 10);
INSERT INTO jos_posts VALUES (2, 'GUEST', 0, 20);

DROP TABLE IF EXISTS jos_topics;

CREATE TABLE jos_topics (
    Id INTEGER PRIMARY KEY
  , Poster VARCHAR( 20 )
);

INSERT INTO jos_topics VALUES (10, 'JAN');
INSERT INTO jos_topics VALUES (20, 'JON');

DROP TABLE IF EXISTS jos_users;

CREATE TABLE jos_users (
    Poster_ID INTEGER PRIMARY KEY
  , Username VARCHAR( 20 )
);

INSERT INTO jos_users VALUES (2153, 'JAN');
INSERT INTO jos_users VALUES (2154, 'JON');

SELECT * FROM jos_posts;

-- please insert solution here    

SELECT * FROM jos_posts;

然后像弗兰克施密特这样的大师可以立即发布他的解决方案,像我这样的挑剔者不需要花费数小时来获得反对的证据

update jos_posts set poster = (
  select u.username from jos_users u where u.poster_id = poster_id
);

应该是:

update jos_posts p set poster = (
  select u.username from jos_users u where u.poster_id = p.poster_id
);