复杂的PHP查询

时间:2012-03-27 19:05:14

标签: php mysql

我有2张桌子。

books (id, sku, name, description, date_added)

books_views (id, sku, date_viewed)

我正在尝试编写一个优化查询来执行以下操作。

  1. 查找上周查看次数最多的图书
  2. 查找上个月查看次数最多的图书
  3. books_views表有超过400万条目。根据周和月的视图对数据进行排序的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

查询是:

SELECT sku, count(*) AS times_viewed
FROM book_views bv
WHERE date_viewed > DATE_SUB(NOW(), INTERVAL 7 DAY) 
GROUP BY sku
ORDER BY times_viewed DESC

要获取当月的观看次数,请将间隔更改为30天。

为了加快速度,您需要确保表格已正确编入索引。您肯定需要date_viewed上的索引。如果您还想要书名,则需要索引两个表中的sku列。以下是您如何获得图书名称。

SELECT bv.sku, name, count(*) AS times_viewed
FROM book_views bv JOIN books b ON bv.sku = b.sku
WHERE date_viewed > DATE_SUB(NOW(), INTERVAL 7 DAY) 
GROUP BY bv.sku
ORDER BY times_viewed DESC

答案 1 :(得分:0)

除非您的books_views表中包含您未在此处显示的其他字段,否则您应该使用sku和date_viewed上的PK将您的观看表更改为 - books_views (sku, date_viewed, views)

然后将您的插入修改为双键上的插入 -

INSERT INTO books_views VALUES ('sku', CURRENT_DATE, 1)
    ON DUPLICATE KEY UPDATE views = views + 1;

如果您想获得最佳性能,假设您可以执行更多更新而不是插入 -

UPDATE books_views
SET views = views + 1
WHERE sku = 'sku'
AND date_viewed = CURRENT_DATE;

然后检查受影响的行数,然后在没有行受影响的情况下插入 -

INSERT INTO books_views VALUES ('sku', CURRENT_DATE, 1);