[英]MySQL Multi-Row Sub Query fix
我试图在每个用户唯一的日期/时间之前从所有用户返回所有数据。
我可以为每个用户返回确切日期的所有数据,没问题,但是我不知道如何扩展查询以返回小于或等于关键日期的日期。
我有一个2表SQL数据库。
表1-“销售”具有所有交易的确认记录。
表2-“ user_data”具有所有浏览数据的记录
我需要获取所有购买用户的所有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.