Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL语句,其中如果下一个值与当前值相同,则跳过该值_Php_Mysqli - Fatal编程技术网

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