是否对查询结果运行查询?(PHP+;SQL)

是否对查询结果运行查询?(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

我目前有一个包含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 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进行适当的索引来增加执行时间