0

我有表,并且该表与表item_views相关联,这是结构:

  create_table "item_views", :force => true do |t|
    t.integer  "item_id"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

当我在数据库上运行这个 AR 查询时:

current_user.items.joins(:item_views).where("item_views.created_at > ? AND item_views.created_at < ?", date_from, date_to+1.day).count

然后生成以下 SQL 查询:

SELECT COUNT(*) FROM "items" INNER JOIN "item_views" ON "item_views"."item_id" = "items"."id" WHERE "items"."user_id" = 1 AND (item_views.created_at > '2013-09-10' AND item_views.created_at < '2013-09-20');

以下是item_views表中的数据:

select * from item_views;
1|1|2013-09-10 09:52:11.703811|2013-09-10 09:52:11.703811
2|1|2013-09-13 22:55:56.574696|2013-09-13 22:55:56.574696
3|1|2013-09-15 13:14:19.221074|2013-09-15 13:14:19.221074
4|2|2013-09-16 13:05:39.972383|2013-09-16 13:05:39.972383
5|3|2013-09-16 13:11:25.466117|2013-09-16 13:11:25.466117
6|1|2013-09-16 19:12:44.846686|2013-09-16 19:12:44.846686

(id、item_id、created_at、updated_at)

查询应该返回值3,但它返回的不是5 - 看起来在查询中忽略了条件"items"."user_id" = 1

这怎么可能,或者我错过了什么?

谢谢

4

1 回答 1

0

我不知道为什么它会返回 5。4看起来是正确的答案。

SELECT COUNT(*)
FROM "items" INNER JOIN
     "item_views"
     ON "item_views"."item_id" = "items"."id"
WHERE "items"."user_id" = 1 AND
      (item_views.created_at > '2013-09-10' AND item_views.created_at < '2013-09-20');

您数据中的所有 6 行都满足日期条件。是的,'2013-09-10 09:52:11.703811'大于'2013-09-10'。也许意图是:

WHERE "items"."user_id" = 1 AND
      (date(item_views.created_at) > '2013-09-10' AND
       date(item_views.created_at) < '2013-09-20'
      );

更有效地表示为:

WHERE "items"."user_id" = 1 AND
      (item_views.created_at >= '2013-09-11' AND
       item_views.created_at < '2013-09-20'
      );

你确定没有更多的1行吗?在任何情况下,您都应该运行查询select *而不是select count(*)查看它返回的内容。

于 2013-09-19T20:13:44.003 回答