【问题标题】:Rewrite this IN query using JOIN for speedy results使用 JOIN 重写此 IN 查询以获得快速结果
【发布时间】:2014-01-25 00:43:58
【问题描述】:

我有这个有效的查询,但计算需要 30 分钟。我知道 IN 很慢,但正在寻找加入替代方案。

SELECT *, COUNT(*) as Results from member_preferences_products_data
        WHERE member_preferences_products_data.Member_ID IN (SELECT Member_ID from member_preferences_products_data WHERE Product_ID = '623')
        GROUP by Product_ID
        ORDER by Results asc
        LIMIT 10

【问题讨论】:

  • 而且我确定您已经进行了一些研究或谷歌搜索,您现在将编辑您的问题并将其添加...您肯定不只是要求我们为您完成工作吗?
  • 我试过了,但它会产生错误的结果。我有很多关于其他查询的连接,它们都有效,所以我不确定为什么我的没有。
  • 来吧。让我们看看JOIN
  • 所以你做了几次尝试并决定不向我们展示这些?您的问题应该是:“我正在尝试找到一个 IN 替代方案,这是我的原始查询,我尝试了 X、Y、Z,但它给了我类似 1 的结果,当我需要类似 2 的结果时。有人可以告诉我我的做错了。”这显示了一个人的努力程度,并给某人一些工作,而不是说这是我的代码,修复它!
  • 我很抱歉。我正在做其他事情,我承认我并没有真正花时间在我的帖子上。不会再发生了。

标签: mysql join


【解决方案1】:

您查询的直接替代品是

SELECT *, COUNT(*) as Results 
FROM member_preferences_products_data
INNER JOIN 
(
    SELECT DISTINCT Member_ID
    FROM member_preferences_products_data 
    WHERE Product_ID = '623'
) Sub1
ON member_preferences_products_data.Member_ID = Sub1.Member_ID
GROUP by Product_ID
ORDER by Results asc
LIMIT 10

但是,我对您要查找的内容有些困惑。您似乎想要计算每个产品 id 的行数,其中该产品 id 已被购买产品 id 623 的成员购买。

此外,如果字段 Product_ID 是字符串或 INT。如果是 INT,则不需要引号,但如果它是字符串,那么假设值是数字,它可能会比 INT 字段慢

【讨论】:

  • 完美运行。谢谢你。这正是我正在寻找的结果。
猜你喜欢
  • 1970-01-01
  • 2022-09-30
  • 2014-02-04
  • 2017-02-09
  • 2017-02-06
  • 2019-05-28
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
相关资源
最近更新 更多