SQL语句,如果下一个值与当前值相同,则跳过该值

时间:2019-03-05 14:32:02

标签: php mysqli

这是我的桌子

| id | date      | data |
|----|-----------|------|
| 1  | 2019/03/12| data1|
| 2  | 2019/03/12| data2|
| 3  | 2019/03/04| data3|
| 4  | 2019/03/04| data4|
| 5  | 2019/03/04| data5|
| 6  | 2019/03/05| data6|
| 7  | 2019/03/05| data7|

我的预期结果看起来像

| id | date      | data |
|----|-----------|------|
| 1  | 2019/03/12| data1|
| 3  | 2019/03/04| data3|
| 6  | 2019/03/05| data6|

所以基本上我想做的是,如果日期值与当前日期值相同,则不显示下一行

我尝试过

$sql = "SELECT * FROM `table` table1 WHERE NOT EXISTS (SELECT 1 FROM `table` WHERE `date` = table1.date)";

但是它总是返回0个结果...

3 个答案:

答案 0 :(得分:2)

这里的逻辑可以说是您想显示一条记录,如果存在以下一种情况:

  • 这是表中的第一条记录,或者
  • 紧接其前的记录具有不同的日期值

我们可以尝试以下查询:

SELECT id, date, data
FROM table1 t1
WHERE t1.date <> (SELECT t2.date FROM table1 t2
                  WHERE t2.id < t1.id ORDER BY t2.id DESC LIMIT 1) OR
      t1.id = (SELECT MIN(id) FROM table1)
ORDER BY t1.id;

enter image description here

Demo

编辑:

如果您使用的是MySQL 5.7或更早版本,则上述解决方案是一种选择。如果您可以访问MySQL 8+,尤其是LAG函数,那么可以使用一种更简洁的方法来实现此目的:

WITH cte AS (
    SELECT id, date, data,
        LAG(date, 1) OVER (ORDER BY id) date_prev
    FROM table1
)

SELECT id, date, data
FROM cte
WHERE date <> date_prev OR date_prev IS NULL
ORDER BY id;

这使用相同的逻辑,但使用LAG以避免混乱和冗长的子查询。

答案 1 :(得分:1)

您可以使用外部联接

select a.* from `table` as a left join `table` as b on a.id > b.id and a.date=b.date where b.id is null

DEMO

答案 2 :(得分:0)

一种快速的方法是包括以下where子句:

SELECT * FROM `table` table1 
where id in (select min(`id`) from `table` group by `date`)

您只对每个日期的第一行感兴趣。假设您的id列是一个增量索引,并且您始终对第一条记录感兴趣。