繁体   English   中英

MySQL多行子查询修复

[英]MySQL Multi-Row Sub Query fix

我试图在每个用户唯一的日期/时间之前从所有用户返回所有数据。

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

我有一个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”更改为“ <=”,但是我无法通过返回多于1行的子查询来实现。

免责声明-我没有写数据库,我没有更改数据库的权限(我也不适合这样做)

免责声明2-我知道使用purchase_made会使结果有些混乱,因为并非所有这些都是购买。 但是由于有报表,销售表中的日期可能要花足够长的时间才能比使用与purchase_made关联的时间戳(实际上是通过对实际数据集进行的大量查询比较证明)可靠得多。 但是从上面的要求是,这并不重要,他们会对“大部分”的准确性感到满意。

“现在,我真正想要的是能够将第二个“ 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)

我怀疑sales表会越来越大,并且IN会随着时间的推移而降低性能,因为子查询早就存在,从而导致性能提高。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM