首先我们需要明白SQL语言的局限,它属于面向集合的描述性语言,该语言无法在记录间进行浏览定位,因此涉及需要进行不同记录间进行比较的问题时,它会很无力。题主这类问题最好交由应用程序端用编程的方法解决,而在数据库端单纯用SQL语言解决则会相当麻烦和低效,很多时候甚至是无解的。
下面就题主的问题尝试用纯SQL查询来实现,请参考系列实验:
-- 创建测试表并插入测试数据
DROP TABLE IF EXISTS TEST
CREATE TABLE TEST (USERID VARCHAR(10),MONTHID INT)
INSERT INTO TEST VALUES
('10001',1),('10002',3),('10003',2),('10002',4),
('10002',3),('10001',2),('10001',3),('10002',12)
-- 查看测试数据
SELECT * FROM TEST
-- 筛选出曾经连续活跃2个月和3个月的用户ID
SELECT T.USERID,
CASE WHEN MAX(T.DIFF1)=1 THEN '是' ELSE '否' END AS 连续活跃两月,
CASE WHEN MAX(T.DIFF2)=2 THEN '是' ELSE '否' END AS 连续活跃三月
FROM (SELECT A.*,
(A.MONTHID-(SELECT MAX(MONTHID) FROM TEST WHERE
USERID=A.USERID AND MONTHID<A.MONTHID))
AS DIFF1,
(A.MONTHID-(SELECT MAX(MONTHID) FROM TEST WHERE
USERID=A.USERID AND
MONTHID<(SELECT MAX(MONTHID) FROM TEST WHERE
USERID=A.USERID AND MONTHID<A.MONTHID))) AS DIFF2 FROM TEST A) T
WHERE T.DIFF1=1 OR T.DIFF2=2 GROUP BY T.USERID
DROP TABLE IF EXISTS TEST -- 删除测试表
实验截图
输出效果
<?php$conn=mysql_connect("localhost","root","")or die("数据库服务器连接错误".mysql_error())
mysql_select_db("test",$conn)or die("数据库访问错误".mysql_error())
mysql_query("set names gb2312")
$stime = $yesterday = date('Y-m-d H:i:s',strtotime('-60 day'))
$etime = date('Y-m-d H:i:s')
$sql = "SELECT * FROM biao1 WHERE addtime>={$stime } AND addtime<={$etime} "
."ORDER BY addtime DESC "
$query = mysql_query($sql)
while($row = mysql_fetch_array($query))
{
echo '<pre>'
print_r($row)
}
?>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)