Инструкция SQL, где, если следующее значение совпадает с текущим, пропустите это значение - PullRequest
2 голосов
/ 05 марта 2019

Это мой стол

| 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 ]

2 голосов
/ 05 марта 2019

Логика здесь может быть сформулирована так, что вы хотите отобразить запись, если либо:

  • Это самая первая запись в таблице, либо
  • Запись, непосредственно предшествующаяу него было другое значение даты

Мы можем попробовать следующий запрос:

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

Демо

Редактировать:

Приведенное выше решение является одним из вариантов, если вы используете 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 голос
/ 05 марта 2019

Вы можете использовать внешнее соединение

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

0 голосов
/ 05 марта 2019

Быстрый способ сделать это - включить следующее выражение where:

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

Вас интересуют только строки, являющиеся первой строкой на дату.Это предполагает, что ваш столбец идентификатора является инкрементным индексом и что вас всегда интересует первая запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...