Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите DISTINCT или GROUP BY / 25 сообщений из 25, страница 1 из 1
10.09.2019, 10:34
    #39859718
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Здравствуйте Уважаемые!
есть таблица

id | name | value
1 | n1 | v1
2 | n2 | v1
3 | n3 | v2
4 | n4 |
5 | n5 |
6 | n6 | v6
7 | n7 | v6

Подскажите пожалуйста как выбрать записи с уникальным вхождением value, только если value заполнен?
Чтобы выборка выглядела следующим образом:

id | name | value
1 | n1 | v1
3 | n3 | v2
4 | n4 |
5 | n5 |
6 | n6 | v6

Т.е. выбрать записи, в которых value, если заполнено, то встречается первый раз, и если не заполнено вообще.

Пробовал запрос "SELECT * FROM table GROUP BY value", но в выборку попадает только первое пустое значение.
DISTINCT также не дал результатов.
...
Рейтинг: 0 / 0
10.09.2019, 11:11
    #39859732
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Код: sql
1.
2.
3.
4.
5.
6.
SELECT t1.*
FROM source t1
WHERE NOT EXISTS ( SELECT 1
                   FROM source t2
                   WHERE t1.value = t2.value
                     AND t1.id > t2.id )
...
Рейтинг: 0 / 0
10.09.2019, 11:33
    #39859740
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Akina,

А комментарий можно? Как это работает что такое source?
...
Рейтинг: 0 / 0
10.09.2019, 11:36
    #39859745
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Vladimir_KZNчто такое source?Таблица исходная, которая с данными, которая на скриншоте.

Vladimir_KZNКак это работаетПросто переведи с английского на русский.
...
Рейтинг: 0 / 0
10.09.2019, 11:40
    #39859750
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Понял, это моя таблица). Выполнил ваш запрос, результат:
id | name | value
1 | n1 | v1
3 | n3 | v2
4 | n4
6 | n6 | v6

Делает тоже самое, что и мой запрос, берет только первое вхождение с пустым value, а должен брать все
...
Рейтинг: 0 / 0
10.09.2019, 11:43
    #39859753
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Akina,

Спасибо за ответ, но не работает, в выборке должны участвовать все записи с пустым value
...
Рейтинг: 0 / 0
10.09.2019, 12:03
    #39859763
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Akina,

Добавил в конце вашего варианта дополнительное условие OR value = '' и заработало!
В итоге получился такой запрос
SELECT t1.*
FROM source t1
WHERE NOT EXISTS ( SELECT 1
FROM source t2
WHERE t1.value = t2.value
AND t1.id > t2.id)
OR t1.value = ''
...
Рейтинг: 0 / 0
10.09.2019, 12:13
    #39859767
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Vladimir_KZNне работает, в выборке должны участвовать все записи с пустым value
Бред. Всё работает. Если value действительно пусто, т.е. NULL: fiddle .
А вот если там строка нулевой длины... но кто ж виноват, что некоторые товарищи не могут корректно сформулировать задачу?
...
Рейтинг: 0 / 0
10.09.2019, 12:20
    #39859770
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Vladimir_KZNДелает тоже самое, что и мой запрос...
Не то же самое. Ваш запрос берет произвольные значения из группы, а по условию требуется первая запись.
...
Рейтинг: 0 / 0
10.09.2019, 12:23
    #39859773
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Спасибо всем огромное! Дай вам бог здоровья! Все получилось!
...
Рейтинг: 0 / 0
10.09.2019, 17:05
    #39859964
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Новая проблема, внедрил данное решение, но по времени выполнение увеличилось более чем в 5 раз, можно ли как-то оптимизировать данный запрос или выполнить задачу другим способом?
...
Рейтинг: 0 / 0
10.09.2019, 17:15
    #39859971
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Может все таки через DISTINCT или GROUP BY возможно решить данную задачу?
...
Рейтинг: 0 / 0
10.09.2019, 17:17
    #39859972
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Akina, Не правильно выразился, не пустое, а строка нулевой длины. Простите!
...
Рейтинг: 0 / 0
10.09.2019, 17:58
    #39859988
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Сформировал такой запрос
SELECT * FROM `source` GROUP BY IF ((value != ''), value, id) ORDER BY id ASC
Скажите не сильно ли колхозно получилось?
...
Рейтинг: 0 / 0
10.09.2019, 20:06
    #39860030
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Vladimir_KZNпо времени выполнение увеличилось более чем в 5 разНебось индексов нету...

Vladimir_KZNне сильно ли колхозно получилось?Это ж фулскан гарантированный... уж лучше на UNION перепиши.
...
Рейтинг: 0 / 0
11.09.2019, 09:12
    #39860126
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
AkinaVladimir_KZNпо времени выполнение увеличилось более чем в 5 разНебось индексов нету...

Vladimir_KZNне сильно ли колхозно получилось?Это ж фулскан гарантированный... уж лучше на UNION перепиши.

id - первичный ключ. Подскажите как переписать на union? Просто сам запрос большой, здесь я упростил его до определенной проблемы. В запросе много LEFT JOIN-ов с дополнительной выборкой из других таблиц
...
Рейтинг: 0 / 0
11.09.2019, 10:00
    #39860157
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Vladimir_KZNкак переписать на union?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t1.*
FROM source t1
WHERE NOT EXISTS ( SELECT 1
                   FROM source t2
                   WHERE t1.value = t2.value
                     AND t1.id > t2.id )
UNION ALL

SELECT t1.*
FROM source t1
WHERE t1.value = ''



Vladimir_KZNсам запрос большой, здесь я упростил его до определенной проблемы. В запросе много LEFT JOIN-ов с дополнительной выборкой из других таблиц
Версия сервера какая? только ТОЧНО.
...
Рейтинг: 0 / 0
11.09.2019, 10:25
    #39860169
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
AkinaВерсия сервера какая? только ТОЧНО.
На рабочем сервере MySQL 5.7.27-0ubuntu0.16.04.1
На тестовой среде MySQL 5.6
...
Рейтинг: 0 / 0
11.09.2019, 10:49
    #39860182
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Akina
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t1.*
FROM source t1
WHERE NOT EXISTS ( SELECT 1
                   FROM source t2
                   WHERE t1.value = t2.value
                     AND t1.id > t2.id )
UNION ALL

SELECT t1.*
FROM source t1
WHERE t1.value = ''



По-моему добавление еще одного SELECT не ускорит выполнение запроса. Поясните пожалуйста если ошибаюсь.
...
Рейтинг: 0 / 0
11.09.2019, 11:06
    #39860194
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Вы ошибаетесь. Проверьте.
Для ускорения создайте индекс (value, id), если это возможно.

Vladimir_KZNНа рабочем сервере MySQL 5.7.27-0ubuntu0.16.04.1
На тестовой среде MySQL 5.6
Хреново, CTE недоступны. Подумайте об обновлении до восьмёрки, сколько можно на седой древности-то работать?
...
Рейтинг: 0 / 0
11.09.2019, 11:35
    #39860208
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
AkinaВы ошибаетесь. Проверьте.
Проверил, ваш запрос выполняется 0,0017, мой 0,0005
AkinaДля ускорения создайте индекс (value, id), если это возможно.
Думаю индекс поменять не возможно.
...
Рейтинг: 0 / 0
11.09.2019, 12:09
    #39860223
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Vladimir_KZNСформировал такой запрос
SELECT * FROM `source` GROUP BY IF ((value != ''), value, id) ORDER BY id ASC
Скажите не сильно ли колхозно получилось?
Уже писал: ваш запрос некорректен. Вам нужно получить первые записи в группах, а запрос возвращает случайные значения полей из групп.
...
Рейтинг: 0 / 0
11.09.2019, 12:56
    #39860261
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
Vladimir_KZNваш запрос выполняется 0,0017, мой 0,0005Это ни о чём.

Vladimir_KZNиндекс поменять не возможноЧто значит "поменять"???
...
Рейтинг: 0 / 0
11.09.2019, 14:21
    #39860335
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
paver,

Не правильно выразился, давайте считать что нужно взять произвольное. Вопрос то не в этом PAVER
...
Рейтинг: 0 / 0
11.09.2019, 14:25
    #39860338
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите DISTINCT или GROUP BY
AkinaVladimir_KZNваш запрос выполняется 0,0017, мой 0,0005Это ни о чём.

При внедрении запроса в рабочую среду с выборкой из 2000 записей ваш увеличивает скорость загрузки страницы до 5 секунд, мой - около 1 секунды.
Понятно что тысячные секунды при выборке из 8 записей это ни о чем, но при внедрении на сайт разница значительна.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите DISTINCT или GROUP BY / 25 сообщений из 25, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]