не возвращать ни одной дублированной строки mysql - PullRequest
0 голосов
/ 04 января 2019

Допустим, у меня есть таблица с двумя столбцами begin_timestamp и images.

Сначала я делаю это заявление

SELECT images 
FROM myTable 
WHERE begin_timestamp < 1546646400 && images != 'default.png';

Это вернет мне список строк, таких как:

'123.jpg'
'abc.jpg'
'test.jpg'

В качестве второго я хочу проверить, есть ли дублирование одного или нескольких элементов в этом списке в таблице отверстий. Если да, вычеркните эту строку из списка. Например, если другая строка в таблице содержит 123.jpg в качестве значения изображения, я просто хочу получить список, подобный

[abc.jpg, test.jpg]

Теперь у меня вопрос: как я могу объединить первый и второй шаг в одну инструкцию mySQL?

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Другой способ сделать это с НЕ СУЩЕСТВУЕТ.

Я предположил, что у вас есть и поле id в таблице:

SELECT images 
FROM myTable m1
where m1.begin_timestamp < 1546646400 && m1.images != 'default.png'
and NOT EXISTS(select 1 from myTable m2 where m1.images = m2.images and m1.id != m2.id)
0 голосов
/ 04 января 2019

объявить @image varchar (макс.) set @image = ''

SELECT @ image = @ image + ',' + images ИЗ myTable ГДЕ begin_timestamp <1546646400 AND images! = 'Default.png' GROUP BY изображения СЧЕТЧИК (*) = 1 </p>

выберите @ изображение

0 голосов
/ 04 января 2019

Вы можете достичь этого, используя GROUP BY.

Во-первых, давайте сделаем выбор, как указано выше:

SELECT images
FROM myTable
WHERE begin_timestamp < 1546646400 AND images != 'default.png'
GROUP BY images;

Теперь, поскольку мы сгруппированы по images, у нас есть доступ к агрегатным функциям . Мы можем добавить желаемый фильтр, например, в конце запроса:

HAVING COUNT(images) = 1

Обратите внимание, что поскольку мы сгруппировали по images, это единственное, что мы можем напрямую запросить в части SELECT. Если вы хотите выбрать любые другие поля, вы должны сделать это также через агрегатную функцию, например, SELECT images, MIN(some_field). Или, если images является первичным ключом, используйте его в подзапросе или объединении.


Если вам нужно удалить дубликаты до с применением условия фильтра WHERE, вы можете использовать такой подзапрос, как этот:

SELECT images FROM (
    SELECT images, MIN(begin_timestamp) as begin_timestamp
    FROM myTable
    GROUP BY images
    HAVING COUNT(images) = 1)
WHERE begin_timestamp < 1546646400 AND images != 'default.png';
...