我有两张桌子。 Items有字段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服务器已经离开'或'查询执行被中断'。我认为这是因为查询要求太高。如果没有服务器进行拆分,有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
嗯,糟糕的表现是你为设计不佳的数据结构付出的代价。这是您的查询:
update items
set number = (select count(*)
from lists
where list like concat('%',items.id,'%')
)
where title > 'Z';
list like
语句建议您将项目ID存储为列表顺便提一下,您应该在语句中包含分隔符,这样就不会出现与匹配'10,11,12'
匹配的不匹配:< / p>
where concat(',', list, ',') like concat('%,', items.id, ',%')
(假设逗号为分隔符)或:
where find_in_set(items.id, list) > 0;
那就是说,我想不出一种方法来加速这部分查询。正确的解决方案是拥有一个名为ListItems
的关联表,每个列表和列表中的项目有一行。然后,您可以使用equi-joins和索引来加速查询。