是否对查询结果运行查询?(PHP+;SQL)
我目前有一个包含1100000行的表,其中包含用户数据 它的格式有点像这样:是否对查询结果运行查询?(PHP+;SQL),php,mysql,sql,Php,Mysql,Sql,我目前有一个包含1100000行的表,其中包含用户数据 它的格式有点像这样: 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
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
在这个查询结果的基础上,我可以运行上面的查询,我认为这将导致更快的执行时间(如果我错了,请纠正我)
你们知道怎么做吗?你们可以使用or将所有这些查询组合成一个查询
SELECT *
FROM USERS_TABLE
WHERE (Date = 09092014 OR Date = 08092014)
AND (Action="Shopping" OR Action="Eating")
AND User_Id = 5
我假设您有一个具有唯一用户ID的表。如果你不这样做,你会考虑吗?如果单个用户没有单个条目,如何管理配置文件?不管怎么说,这不关我的事,但我们假设您有这样一个表,它有一个
唯一的字段,带有用户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
确保索引用户Id、日期和操作,因为我们正在搜索它们 在为用户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列)。这可以修改为接受日期范围和其他限制。当我需要聚合多个用户的日期时,这给了我一些额外的灵活性。我想你的意思可以这样回答:
select action, actiondate
from
(select *
from USERS_TABLE
where user_id = 5) as filter
小提琴
派生表基本上充当您描述的过滤器
它是否会更快是很难预测的——我会在您的生产系统上运行它,看看查询计划是怎么说的 是的,我知道怎么做……但你有什么要求?技术?PHP代码?事实上,mysql服务器存在的全部原因是一次在多个列上尽可能快地搜索。让这个人做他的工作,坚持第一个解决方案。如果要降低速度,您可能需要添加索引。@JoeSwindell(如果可能的话):)好吧,可能首先了解mysql或operator@FélixGagnon Grenier我想你不明白我想问什么,我很快会重新措辞。我怀疑这会减少查询的执行时间。。我错了吗?您必须进行测试,但是您可以通过对表@user3146699进行适当的索引来增加执行时间