PHP/MySql:通过与列表比较找到缺失的记录
我有50,000个用户记录,其中包含一个以逗号分隔的列表booklist
的字段bookIDs
。 我有一个book
表,bookID
作为主键,有大约100,000条记录。PHP/MySql:通过与列表比较找到缺失的记录
我想遍历所有用户及其booklist
,以确定book
表中是否存在匹配的bookID
。如果它不在book
表中,我需要将bookID
插入到book
表中。
这可以用SQL来完成吗?
如果我使用PHP,我会好起来的bookID
所有列表组合成一个长字符串或数组,然后遍历所有bookID
在book
表中查找缺少的?
这是一次性的脚本,所以越简单越好;-)
嘛,你不应该有一个逗号分隔,多值字段,这将防止SQL总的解决方案。恐怕你现在太深了吧?
让我们看看你的问题。
我要遍历所有的用户和他们的bookIDs的列表,以找出是否有书中表中的匹配BOOKID。如果没有我需要的是BOOKID插入书表
既然你这样做的愚蠢的方式,开始由:
选择每个用户
爆炸的书目场到个人bookIDs
将这些添加到独特(无重复)的bookID集。
一旦您拥有每个用户在该字段中曾经拥有过的每个bookID,就可以遍历book表。如果您没有在您的独特集中找到任何bookID,请将这些bookID插入到书籍表中。
什么应该发生的是,你应该有一个单独的表“书目”一个id为PK,这将对每个用户ID和每个BOOKID。然后,您可以提取每个用户ID,因此每个用户ID具有相同的bookID,反之亦然。
我有道理吗?
编辑:我也意识到你应该进行排序和搜索,以尽可能高效的,但你没有提到这是一个一次性的计划...
谢谢,这就实现了。我决定不遵循好的数据库设计,因为这些记录仅用于审计目的,而且我没有计划对它们进行查询。当我不得不把它变成一个主要的PITA时---(感谢大家的帮助! – MotoTribe 2012-02-01 23:55:55
正如其他人已经说过,有应该避免在数据库列上使用逗号分隔的ID列表。
但是既然你已经有了它,你可以使用mysql FIND_IN_SET
。它会进行字符串比较,这可能会很慢,并且工作原理如下:将两个字符串传递给FIND_IN_SET
,第一个是要搜索的ID,第二个是逗号分隔列表。如果在列表中没有找到该字符串,该函数将返回零,或者如果找到该字符串,则返回该列表中的字符串位置。
对不起,我无法为您的问题提供完整的解决方案,但我希望这有助于您。
对不起,不回答你的问题,但真正的答案是一个数据库设计是这样的。看看如何简单和可扩展的增长和查询。
关联表(assoc_users_booklist)包含大部分记录,在uid和bid上都有许多联接。用户表在id = uid上关联一对多关系。书籍表在id = bid时将一对多关联起来。
这并不回答这个问题,它只是告诉他们重新做数据库。在'assoc_user_booklist'中找不到的值 – beta0x64 2012-02-01 23:10:12
尽管改变的时间已经太晚了,但您已经找到了错误的问题。您应该有3个表格:'用户','书籍'和'书目列表',书签在书籍和用户之间具有多对多的关系。 – 2012-02-01 20:08:06
[“如何搜索逗号分隔值”](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