PHP / MySql:通过与列表进行比较来查找丢失的记录

时间:2012-02-01 19:53:29

标签: php mysql

我有50,000个用户记录,其中包含一个字段booklist,其中包含逗号分隔bookIDs的列表。 我有一个book表,其中bookID为主键,大约有100,000条记录。

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

这可以单独用SQL完成吗?

如果我使用PHP,我最好将bookID的所有列表组合成一个长字符串或数组,然后循环遍历bookID表中的所有book以查找缺少什么?

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

3 个答案:

答案 0 :(得分:2)

好吧,您不应该使用逗号分隔的多值字段,这样会阻止整个SQL解决方案。我担心你现在太深了,对吗?

让我们来看看你的问题。

  

我想循环遍历所有用户及其bookID列表,以查明book表中是否存在匹配的bookID。如果不是,我需要将bookID插入书表

既然你这样做是愚蠢的方式,请从:

开始
  1. 选择每个用户

  2. 将他们的booklist字段扩展为单独的bookID

  3. 将这些添加到一组不同的(不重复)bookID中。

  4. 一旦你拥有了每个用户在该字段中拥有的每个bookID,就可以遍历书籍表。如果您没有从您的不同集合中找到任何bookID,请将这些bookID插入到book表中。

  5. 应该发生的事情是你应该有一个单独的表“booklist”,其id为PK,它将包含每个userID和每个bookID。然后,您可以提取每个userID,从而提取userID所拥有的每个bookID,反之亦然。

    我有道理吗?

    编辑:我也意识到你应该排序和搜索尽可能高效,但你确实提到这是一次性的程序......

答案 1 :(得分:1)

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

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

对不起,我现在无法为您解决问题,但我希望这会有所帮助。

答案 2 :(得分:0)

很抱歉没有回答你的问题,但真正的答案是像这样的数据库设计。看看增长和查询是多么简单和可扩展。 enter image description here

关联表(assoc_users_booklist)包含大部分记录,uid和bid都有很多连接。 users表在id = uid上关联一对多。书籍表在id = bid上关联一对多。