这是我的桌子
| 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个结果...
答案 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;
编辑:
如果您使用的是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
答案 2 :(得分:0)
一种快速的方法是包括以下where子句:
SELECT * FROM `table` table1
where id in (select min(`id`) from `table` group by `date`)
您只对每个日期的第一行感兴趣。假设您的id列是一个增量索引,并且您始终对第一条记录感兴趣。