可伸缩的单个查询,用于提取具有多个唯一主要ID的行

时间:2011-02-12 23:25:39

标签: mysql sql optimization

所以我在mysql数据库中得到了用户对项目的评分,我想知道最好的方法是检查一个项目列表是否已被用户评分。

  1. 我可以在一个查询中提取用户曾评价过的所有项目,然后浏览该列表,查找列表中的项目。
  2. 另一种方法是使用单个查询来检查每个项目是否已被评级。
  3. 第一种方式具有使用单个查询的好处,第二种方式不需要我拉取用户评价过的所有项目。哪一个更好?我是sql的新手,所以我不确定查询开销有多糟糕。此外,如果您有更好的建议,请随时提供。

    根据要求,这是一个示例表。

    CREATE TABLE ratings (
      user id INT NOT NULL, 
      item_id INT NOT NULL, 
      rating INT NOT NULL
    );
    

1 个答案:

答案 0 :(得分:0)

如果您对每个项目使用单个查询,那么您将扫描/搜索ratings这么多次您获得的项目。也许我错过了一些东西,但到目前为止我看不出它比用一个查询检查所有项目更好。

此外,对集合进行操作实际上是SQL最适合的,不是吗?

所以这是一个用于检查所有项目列表的示例查询。

SELECT
  il.item_id,
  CASE
    WHEN r.item_id IS NULL THEN 'No'
    ELSE 'Yes'
  END AS IsRated
FROM itemlist il
  LEFT JOIN ratings r ON il.item_id = r.item_id
                     AND rating > 0
                     AND user = @user

假设一个用户只能对一个项目进行一次评分,所以我不打算在此处删除重复项。