【问题标题】:MYSQL: Select changed row whereMYSQL:选择更改的行
【发布时间】:2013-06-13 08:14:54
【问题描述】:

1 -

create table changes(snapdate date,value int, uid int); 
insert into changes values 
('2013-04-22', 0, 1 ), 
('2013-04-21', 1,1 ), 
('2013-04-20', 1,1 ), 
('2013-04-19', 1,1 ), 
('2013-04-19', 0,2 ), 
('2013-04-19', 1,1 ), 
('2013-04-18', 0,1 ), 
('2013-04-17', 0,1 ), 
('2013-04-17', 1,2 ), 
('2013-04-16', 1,1 ), 
('2013-04-16', 0 ,2); 

2 -

SELECT a.snapdate, a.value 
FROM ( 
  SELECT t1.*, COUNT(*) AS rank 
  FROM changes t1
  LEFT JOIN changes t2 ON t1.snapdate >= t2.snapdate 
  GROUP BY t1.snapdate 
) AS a 
LEFT JOIN ( 
  SELECT t1.*, COUNT(*) AS rank 
  FROM changes t1
  LEFT JOIN changes t2 ON t1.snapdate >= t2.snapdate 
  GROUP BY t1.snapdate 
) AS b ON a.rank = b.rank+1 AND a.value = b.value 
WHERE b.snapdate IS NULL
ORDER BY a.snapdate DESC;

工作正常,但如何选择 WHERE uid=2 例如? 我不能使用临时表:

 create temporary table changes_temp
    as
    select *
    from changes
    where uid = 2 

http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    尝试在子查询中添加 WHERE 子句

        SELECT a.snapdate, a.value 
    FROM ( 
      SELECT t1.*, COUNT(*) AS rank 
      FROM changes t1
      LEFT JOIN changes t2 ON t1.snapdate >= t2.snapdate 
      WHERE t2.uid=t1.uid AND t2.uid=2
      GROUP BY t1.snapdate 
    ) AS a 
    LEFT JOIN ( 
      SELECT t1.*, COUNT(*) AS rank 
      FROM changes t1
      LEFT JOIN changes t2 ON t1.snapdate >= t2.snapdate 
      WHERE t2.uid=t1.uid AND t2.uid=2
      GROUP BY t1.snapdate 
    ) AS b ON a.rank = b.rank+1 AND a.value = b.value 
    WHERE b.snapdate IS NULL
    ORDER BY a.snapdate DESC;
    

    创建SQLFiddle 用于测试。 那是你要的吗 ?您没有解释查询的目标

    【讨论】:

      【解决方案2】:

      添加 where 子句:

      SELECT a.snapdate, a.value 
      FROM ( 
        SELECT t1.*, COUNT(*) AS rank 
        FROM changes t1
        LEFT JOIN changes t2 ON t1.snapdate >= t2.snapdate 
        WHERE t1.uid = 2
        GROUP BY t1.snapdate 
      ) AS a 
      LEFT JOIN ( 
        SELECT t1.*, COUNT(*) AS rank 
        FROM changes t1
        LEFT JOIN changes t2 ON t1.snapdate >= t2.snapdate 
        WHERE t1.uid = 2
        GROUP BY t1.snapdate 
      ) AS b ON a.rank = b.rank+1 AND a.value = b.value 
      WHERE b.snapdate IS NULL
      ORDER BY a.snapdate DESC;
      

      sqlfiddle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-23
        • 1970-01-01
        • 1970-01-01
        • 2016-09-28
        • 2019-02-14
        • 1970-01-01
        相关资源
        最近更新 更多