我有50,000个用户记录,其中包含一个字段booklist
,其中包含逗号分隔bookIDs
的列表。
我有一个book
表,其中bookID
为主键,大约有100,000条记录。
我希望遍历所有用户及其booklist
,以查明bookID
表中是否存在匹配的book
。如果它不在book
表中,我需要将bookID
插入book
表。
这可以单独用SQL完成吗?
如果我使用PHP,我最好将bookID
的所有列表组合成一个长字符串或数组,然后循环遍历bookID
表中的所有book
以查找缺少什么?
这是一次性脚本,所以越简单越好; - )
答案 0 :(得分:2)
好吧,您不应该使用逗号分隔的多值字段,这样会阻止整个SQL解决方案。我担心你现在太深了,对吗?
让我们来看看你的问题。
我想循环遍历所有用户及其bookID列表,以查明book表中是否存在匹配的bookID。如果不是,我需要将bookID插入书表
既然你这样做是愚蠢的方式,请从:
开始选择每个用户
将他们的booklist字段扩展为单独的bookID
将这些添加到一组不同的(不重复)bookID中。
一旦你拥有了每个用户在该字段中拥有的每个bookID,就可以遍历书籍表。如果您没有从您的不同集合中找到任何bookID,请将这些bookID插入到book表中。
应该发生的事情是你应该有一个单独的表“booklist”,其id为PK,它将包含每个userID和每个bookID。然后,您可以提取每个userID,从而提取userID所拥有的每个bookID,反之亦然。
我有道理吗?
编辑:我也意识到你应该排序和搜索尽可能高效,但你确实提到这是一次性的程序......
答案 1 :(得分:1)
正如其他人已经说过的那样,应该避免在数据库列上使用以逗号分隔的ID列表。
但是既然你已经有了这种方式,你可以使用mysql FIND_IN_SET
。它进行字符串比较,这可能会很慢,并且工作方式如下:您将两个字符串传递给FIND_IN_SET
,第一个是您要搜索的ID,第二个是以逗号分隔的列表。如果在列表中找不到字符串,则该函数将返回零;如果找到该字符串,则该函数将返回列表中的位置。
对不起,我现在无法为您解决问题,但我希望这会有所帮助。
答案 2 :(得分:0)
很抱歉没有回答你的问题,但真正的答案是像这样的数据库设计。看看增长和查询是多么简单和可扩展。
关联表(assoc_users_booklist)包含大部分记录,uid和bid都有很多连接。 users表在id = uid上关联一对多。书籍表在id = bid上关联一对多。