1

我有两张桌子。项目具有字段 id、title、number。另一个表(列表)中的相关字段(列表)是具有逗号分隔值的字段,这些值是项目的 ID。我希望 items.number 与相关 ID 出现在列表表中的次数相同。例如,此查询可以正常工作以实现此目的...

update items set number = (select count(*) from lists where list like concat('%',items.id,'%')) where title > 'Z'

但是,如果我想更新整个项目(或者甚至只是以“Y”开头的标题,比如说,其中有很多以 Z 开头的 200 个),我会收到错误 - 要么是“MySQL 服务器已消失”或“查询执行被中断”。我认为这是因为查询要求太高。有没有更好的方法来实现这一点而服务器不会崩溃?

4

1 回答 1

1

好吧,糟糕的性能是您为设计不佳的数据结构付出的代价。这是您的查询:

update items
    set number = (select count(*)
                  from lists
                  where list like concat('%',items.id,'%')
                 )
     where title > 'Z';

list like语句建议您将项目 ID 存储为列表顺便说一句,您应该在语句中包含分隔符,这样您就不会得到像 1 匹配这样的不匹配'10,11,12'

where concat(',', list, ',') like concat('%,', items.id, ',%')

(假设逗号作为分隔符),或者:

where find_in_set(items.id, list) > 0;

也就是说,我想不出一种方法来加快这部分查询的速度。正确的解决方案是有一个关联表,称为类似ListItems,每个列表有一行,列表中有项目。然后您可以使用等连接和索引来加快查询速度。

于 2013-08-30T11:31:40.730 回答