gpt4 book ai didi

mysql - Sql:选择包含一组特定项目的所有篮子

转载 作者:行者123 更新时间:2023-11-29 06:23:18 25 4
gpt4 key购买 nike

Eddy 有装有元素的篮子。每个项目可以属于任意数量的篮子,也可以不属于任何篮子。

表示它的 SQL 模式如下:

tbl_basket
- basketId

tbl_item
- itemId

tbl_basket_item
- pkId
- basketId
- itemId

问题:如何选择包含一组特定项目的所有篮子?

更新。需要装有所有元素的篮子。否则解决起来很容易。

更新 B。已实现以下解决方案,包括在 PHP 中生成 SQL:

SELECT basketId
FROM tbl_basket
JOIN (SELECT basketId FROM tbl_basket_item WHERE itemId = 1 ) AS t0 USING(basketId)
JOIN (SELECT basketId FROM tbl_basket_item WHERE itemId = 15 ) AS t1 USING(basketId)
JOIN (SELECT basketId FROM tbl_basket_item WHERE itemId = 488) AS t2 USING(basketId)

其中 JOIN 的数量等于项目的数量。

除非某些商品几乎包含在每个购物篮中,否则效果很好。然后性能急剧下降。

UPDATE B+。 应用启发式方法解决性能问题。首先,您选择每个项目的频率。如果它超过某个阈值,则您不会将其包含在JOIN 中,并且:

  • 在 PHP 中应用后过滤
  • 或者只是不按特定 itemId 应用过滤器,在合理的时间内为用户提供近似结果

UPDATE B++. 看来目前的问题在MySQL中没有很好的解决办法。这一点提出一个问题和一个解决方案:

  • (问题) PostgreSQL 是否有一些高级索引技术可以在不进行全面扫描的情况下解决这个问题?
  • (解决方案) 似乎可以在 Redis 中使用集合和 SINTER 命令获得交集很好地解决这个问题。

最佳答案

我认为最好的方法是创建一个包含所需项目集的临时表(将项目 ID 作为参数或类似的东西的过程),然后将其与上述所有表连接在一起。

如果对于给定的 basketid,左连接的右侧没有空值,则篮子包含所有需要的项目。

关于mysql - Sql:选择包含一组特定项目的所有篮子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32391831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com