2016-11-15 36 views
0

我试图在每个用户唯一的日期/时间之前返回所有用户的所有数据。MySQL多行子查询修复程序

我可以返回每个用户的确切日期的所有数据,没问题,但我不知道如何扩展我的查询以返回日期小于或等于我的关键日期。

我有一个2表SQL数据库。

表1-“销售”具有所有交易的确认记录。

  • USER_ID(日期,然后各种购买信息)

表2 - “的user_data” 具有所有浏览数据的记录

  • USER_ID,record_date,purchase_made(purchase_made是误称,因为他们触发了购买弹出窗口,但可能没有实际购买 - 然后是一大堆用户操作数据)

我需要获取所有已购买的用户的user_data记录,并包括他们的初始购买。

为了得到确切的购买记录,我可以使用以下命令:

SELECT * 
FROM user_data 
WHERE user_id IN (SELECT user_id FROM sales) 
AND record_date IN (SELECT min(record_date) FROM user_data WHERE purchase_made = 1 GROUP BY user_id); 

现在我真正想要的是能够改变的是第二个“IN”为“< =”但我可以”用一个返回多于一行的子查询来做到这一点。

免责声明 - 我没有写的数据库,我没有权限更改数据库(我也不会是这样做的正确的人)

免责声明2 - 我知道,使用purchase_made会略微增加结果,因为不是所有这些都是购买。但由于报告的原因,销售表的日期可能会有足够的时间,因此实际上LESS的可靠性低于使用与purchase_made相关的时间戳(通过在实际数据集上运行的广泛查询比较得到验证)。但是,上面的任务是没关系,他们会对“大部分”准确而感到满意。

回答

0

“现在我真正想要的是能够改变的是第二个‘IN’为” < = IN”

因此,通过我们消除了需要记录相关使其成为相关子查询‘’和现在可以使用<=

SELECT * 
FROM user_data UD 
WHERE user_id IN (SELECT user_id FROM sales) 
    AND record_date <= (SELECT MIN(record_date) 
         FROM user_data UD2 
         WHERE UD2.purchase_made = 1 
         AND UD2.User_ID = UD.User_ID); 

另一种方法是,以USER_ID添加到子查询和,而不是一个子查询让你加入到基础上,USER_ID,然后连接标准比较日期的内嵌视图。

SELECT * 
FROM 
    user_data UD 
INNER JOIN 
    (SELECT MIN(record_date) mrd, User_ID 
    FROM user_data 
    WHERE purchase_made = 1 
    GROUP BY User_ID) UD2 ON UD.user_Id = UD2.user_Id 
          AND UD.record_date <= UD2.RecordDate 
WHERE 
    user_id IN (SELECT user_id FROM sales) 

我会考虑改变where子句...

WHERE 
    user_ID EXISTS (SELECT NULL FROM sales S WHERE S.user_ID = UD.user_ID) 

我怀疑销售表变得越来越大,并在将性能随着时间的推移,那里的存在可以提前存在导致子查询性能得到提高。

+0

我对刚刚发生的事情了解甚少。但我想我喜欢它。我非常肯定,这个工作非常完美,你给了我一些研究的东西。谢谢Q! – Dulock

+0

@杜洛克提问如果你不明白。如果这是你必须维护的东西,或者你正在开发工作,那么这种概念的知识将帮助你! – xQbert