Php SQL语句,其中如果下一个值与当前值相同,则跳过该值
这是我的桌子Php SQL语句,其中如果下一个值与当前值相同,则跳过该值,php,mysqli,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|
| 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个结果…这里的逻辑可以表述为您想要显示一条记录,如果:
- 它是表中的第一条记录,或
- 紧靠它前面的记录具有不同的日期值
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;
这使用了相同的逻辑,但它使用了
LAG
来避免混乱和冗长的子查询。一种快速的方法是包含以下where子句:
SELECT * FROM `table` table1
where id in (select min(`id`) from `table` group by `date`)
您只对每个日期的第一行感兴趣。这假设您的id列是一个增量索引,并且您总是对第一条记录感兴趣。您可以使用外部联接
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
是否会
按日期分组
给出您想要的结果SELECT*FROM
table`table1 GROUP BY date`@Dave,这恰好适用于给定的数据,但通常可能并不总是有效。绝对@TimBiegeleisen。。。这当然不是一个通用的解决方案。假设我有另一个字段,如“时间”,我如何将其包括在您的查询中?如果当前字段的“时间”值与下一个时间值不同,请显示该行。我不完全理解您的要求。你是说现在除了日期之外还有一列时间?如果是这样,那么我建议只使用一个包含日期和时间的时间戳列。是的,我忘了在问题中包含行时间。但是,是的,那会更好。我应该把日期和时间放在同一行,谢谢!
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