2012-02-01 84 views
0

我有50,000个用户记录,其中包含一个以逗号分隔的列表booklist的字段bookIDs。 我有一个book表,bookID作为主键,有大约100,000条记录。PHP/MySql:通过与列表比较找到缺失的记录

我想遍历所有用户及其booklist,以确定book表中是否存在匹配的bookID。如果它不在book表中,我需要将bookID插入到book表中。

这可以用SQL来完成吗?

如果我使用PHP,我会好起来的bookID所有列表组合成一个长字符串或数组,然后遍历所有bookIDbook表中查找缺少的?

这是一次性的脚本,所以越简单越好;-)

+3

尽管改变的时间已经太晚了,但您已经找到了错误的问题。您应该有3个表格:'用户','书籍'和'书目列表',书签在书籍和用户之间具有多对多的关系。 – 2012-02-01 20:08:06

+1

[“如何搜索逗号分隔值”](http://stackoverflow.com/q/3852443/),[“如何将逗号分隔的列表与值匹配?”](http: //“Select select statement using IN operator”](http://stackoverflow.com/q/834074/)。另请参见[“在数据库列中存储逗号分隔列表真的很糟糕吗?”](http://stackoverflow.com/q/3653462/) – outis 2012-02-01 21:10:28

回答

2

嘛,你不应该有一个逗号分隔,多值字段,这将防止SQL总的解决方案。恐怕你现在太深了吧?

让我们看看你的问题。

我要遍历所有的用户和他们的bookIDs的列表,以找出是否有书中表中的匹配BOOKID。如果没有我需要的是BOOKID插入书表

既然你这样做的愚蠢的方式,开始由:

  1. 选择每个用户

  2. 爆炸的书目场到个人bookIDs

  3. 将这些添加到独特(无重复)的bookID集。

  4. 一旦您拥有每个用户在该字段中曾经拥有过的每个bookID,就可以遍历book表。如果您没有在您的独特集中找到任何bookID,请将这些bookID插入到书籍表中。

什么应该发生的是,你应该有一个单独的表“书目”一个id为PK,这将对每个用户ID和每个BOOKID。然后,您可以提取每个用户ID,因此每个用户ID具有相同的bookID,反之亦然。

我有道理吗?

编辑:我也意识到你应该进行排序和搜索,以尽可能高效的,但你没有提到这是一个一次性的计划...

+0

谢谢,这就实现了。我决定不遵循好的数据库设计,因为这些记录仅用于审计目的,而且我没有计划对它们进行查询。当我不得不把它变成一个主要的PITA时---(感谢大家的帮助! – MotoTribe 2012-02-01 23:55:55

1

正如其他人已经说过,有应该避免在数据库列上使用逗号分隔的ID列表。

但是既然你已经有了它,你可以使用mysql FIND_IN_SET。它会进行字符串比较,这可能会很慢,并且工作原理如下:将两个字符串传递给FIND_IN_SET,第一个是要搜索的ID,第二个是逗号分隔列表。如果在列表中没有找到该字符串,该函数将返回零,或者如果找到该字符串,则返回该列表中的字符串位置。

对不起,我无法为您的问题提供完整的解决方案,但我希望这有助于您。

0

对不起,不回答你的问题,但真正的答案是一个数据库设计是这样的。看看如何简单和可扩展的增长和查询。 enter image description here

关联表(assoc_users_booklist)包含大部分记录,在uid和bid上都有许多联接。用户表在id = uid上关联一对多关系。书籍表在id = bid时将一对多关联起来。

+0

这并不回答这个问题,它只是告诉他们重新做数据库。在'assoc_user_booklist'中找不到的值 – beta0x64 2012-02-01 23:10:12