我目前有一个包含1,100,000行的表,其中包含用户的数据。
它的格式有点像这样:
User_Id Date Action
我想知道,而不是每次都在整个表格上搜索特定用户在特定日期通过执行以下操作所做的操作:
SELECT Action FROM USERS_TABLE WHERE Date=08092014 AND User_Id=5
SELECT Action FROM USERS_TABLE WHERE Date=09092014 AND User_Id=5
SELECT Date FROM USERS_TABLE WHERE Action="Shopping" AND User_Id=5
SELECT Date FROM USERS_TABLE WHERE Action="Eating" AND User_Id=5
等
也许我可以做那样的事情:
SELECT * FROM USERS_TABLE WHERE User_Id=5
除了这个查询的结果,我可以运行上面的查询,我认为这会导致更快的执行时间(如果我错了,请纠正我)
你们知道怎么做吗?
答案 0 :(得分:0)
您可以使用或将所有这些查询合并到一个查询中。
SELECT *
FROM USERS_TABLE
WHERE (Date = 09092014 OR Date = 08092014)
AND (Action="Shopping" OR Action="Eating")
AND User_Id = 5
答案 1 :(得分:0)
我假设您有一个包含唯一用户ID的表。如果你不这样做,你可能会考虑吗?如果单个用户没有单一条目,如何管理配置文件?无论如何,这不是我的事,但让我们假设你有一个这样的表,unique
字段User_Id
它在这里命名为USERS
SELECT Action,Date
FROM USERS
LEFT JOIN USERS_TABLE AS Actions
ON (Actions.User_Id=USERS.User_Id AND Date IN (08092014,09092014))
LEFT JOIN USERS_TABLE AS Dates
ON (Dates.User_Id=USERS.User_Id AND Action IN ("Shopping","Eating"))
WHERE USERS.User_Id=5
请务必将User_Id,Date和Action编入索引,因为我们正在搜索它们。
答案 2 :(得分:0)
在我将User_Id列编入索引后,我会做一个交叉表查询 -
SELECT `Date`,
SUM(IF(`Action` = 'Eating', 1, 0)) AS `Eating`,
SUM(IF(`Action` = 'Shopping', 1, 0)) AS `Shopping`
FROM `USERS_TABLE`
WHERE `User_Id` = 5
GROUP BY `Date`
你会得到这样的结果 -
+-------------+---------------+----------+
Date Eating Shopping
+-------------+---------------+----------+
2002-03-01 59 72
2002-03-02 28 0
2002-03-03 22 17
2002-03-04 36 13
2002-03-06 12 0
+-------------+---------------+----------+
为方便起见,我可能会将此数据存储在临时表(带有用户ID列)中。可以修改此选项以接受日期范围和其他限制。当我需要汇总来自多个用户的日期时,这为我提供了一些额外的灵活性。
答案 3 :(得分:0)
我认为你的意思是通过这个回答:
select action, actiondate
from
(select *
from USERS_TABLE
where user_id = 5) as filter
小提琴here。
派生表基本上充当您描述的过滤器。
是否会更快更难以预测 - 我会在您的生产系统上运行它,并查看查询计划的内容。