powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Задача от yandex
14 сообщений из 14, страница 1 из 1
Задача от yandex
    #38883963
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНапишите запрос, выбирающий уникальные пары `id` товаров с одинаковыми `name`, например: (1,2), (4,1), (2,4), (6,3).

Код: sql
1.
2.
3.
4.
5.
CREATE TABLE `goods` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8



Код: sql
1.
insert into goods values(1, 'яблоки'),(2, 'яблоки'),(3, 'груши'),(4,'яблоки'),(5, 'апельсины'), (6, 'груши');



пока варианты следующие:


Код: sql
1.
2.
SELECT g1.id,g2.id FROM goods g1 
INNER JOIN goods g2 ON g1.name=g2.name AND  g1.id<g2.id





Код: sql
1.
2.
3.
4.
SELECT DISTINCT  LEAST(g1.id, g2.id), GREATEST(g1.id, g2.id) 
FROM goods g1
INNER JOIN goods g2 ON g1.name = g2.name
WHERE g1.id < g2.id



Код: sql
1.
2.
3.
4.
5.
SELECT g1.id id1, g2.id id2
FROM goods g1
INNER JOIN goods g2 ON g1.name = g2.name
WHERE g1.id <> g2.id
GROUP BY LEAST(g1.id, g2.id), GREATEST(g1.id, g2.id)



по здравому смыслу лидирует первый с индексом на name.

вопрос - есть ли еще разумные варианты, и оптимизация этих.
...
Рейтинг: 0 / 0
Задача от yandex
    #38883983
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй вариант порадовал... нафига LEAST/GREATEST? на WHERE посмотри...
...
Рейтинг: 0 / 0
Задача от yandex
    #38883986
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первом варианте я бы предложил индекс на (name, id). Или убедиться, что неявное поле id может быть использовано в индексе (name).

Второй вариант при оптимизации вырождается в первый. Функции LEAST и GREATEST уходят из-за WHERE g1.id < g2.id. А затем уходит и DISTINCT, т.к. дублированию записей взяться просто неоткуда.

Третий вариант MySQL-специфичен, поэтому не думаю, что стоит рассматривать его всерьез. Или, по крайней мере, не забыть сделать явную оговорку об этом. Или модифицировать так:
Код: sql
1.
2.
3.
4.
5.
SELECT LEAST(g1.id, g2.id) id1, GREATEST(g1.id, g2.id) id2
FROM goods g1
INNER JOIN goods g2 ON g1.name = g2.name
WHERE g1.id <> g2.id
GROUP BY LEAST(g1.id, g2.id), GREATEST(g1.id, g2.id)

Но он делает больше лишней работы по сравнению с первым вариантом, т.е. выполняться будет дольше.
...
Рейтинг: 0 / 0
Задача от yandex
    #38884039
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ первом варианте я бы предложил индекс на (name, id). Или убедиться, что неявное поле id может быть использовано в индексе (name).

план показывает тот же.
...
Рейтинг: 0 / 0
Задача от yandex
    #38884330
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaВторой вариант порадовал... нафига LEAST/GREATEST? на WHERE посмотри...

тоже хотел написать читая :)
...
Рейтинг: 0 / 0
Задача от yandex
    #38884331
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НО главное, АВТОР, тебя поди не взяли на яндекс??? чисто за невнимательность.

УСЛОВИЕ
Напишите запрос, выбирающий уникальные пары `id` товаров с одинаковыми `name`, например: (1,2), (4,1), (2,4), (6,3).

КАК ИЗ УСЛОВИЯ, ты решил что пара должна быть (-меньший_айди-, -больший_айди-)??
...
Рейтинг: 0 / 0
Задача от yandex
    #38884334
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453НО главное, АВТОР, тебя поди не взяли на яндекс??? чисто за невнимательность.

УСЛОВИЕ
Напишите запрос, выбирающий уникальные пары `id` товаров с одинаковыми `name`, например: (1,2), (4,1), (2,4), (6,3).

КАК ИЗ УСЛОВИЯ, ты решил что пара должна быть (-меньший_айди-, -больший_айди-)??Как я понял, пара (1,2) считается дублем пары (2,1), иначе бы условие уникальности не имело бы смысла.
Какой именно из дублей выдавать в результат никак не регламентировано, поэтому g1.id<g2.id - вполне подходящий вариант. Равно как и g1.id>g2.id
...
Рейтинг: 0 / 0
Задача от yandex
    #38884344
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Если предложенный набор пар был в условии задачи - то можно считать "указано". Там сразу бросается в глаза что есть пар (4,1) ... вот с какого "перепою"? :)
...
Рейтинг: 0 / 0
Задача от yandex
    #38884346
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109miksoft,

Если предложенный набор пар был в условии задачи - то можно считать "указано". Там сразу бросается в глаза что есть пар (4,1) ... вот с какого "перепою"? :)Ну так, кроме примера, больше нет никакого указания какую из пар выбирать, а его явно недостаточно.
...
Рейтинг: 0 / 0
Задача от yandex
    #38884353
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Дык, как пониманю, это не совсем задание, а "вольный пересказ". В любом случае, первый вариант оптимален и нафига огород городить "ещё" - непонятно, если этого не было в задании.
...
Рейтинг: 0 / 0
Задача от yandex
    #38884385
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109miksoft,

Дык, как пониманю, это не совсем задание, а "вольный пересказ". В любом случае, первый вариант оптимален и нафига огород городить "ещё" - непонятно, если этого не было в задании.


авторНапишите запрос, выбирающий уникальные пары `id` товаров с одинаковыми `name`, например:

(1,2), (4,1), (2,4), (6,3)

При решении задачи необходимо учесть, что пары (x,y) и (y,x) — одинаковы.
...
Рейтинг: 0 / 0
Задача от yandex
    #38884601
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftВ первом варианте я бы предложил индекс на (name, id). Или убедиться, что неявное поле id может быть использовано в индексе (name).

Второй вариант при оптимизации вырождается в первый. Функции LEAST и GREATEST уходят из-за WHERE g1.id < g2.id. А затем уходит и DISTINCT, т.к. дублированию записей взяться просто неоткуда.

Третий вариант MySQL-специфичен, поэтому не думаю, что стоит рассматривать его всерьез. Или, по крайней мере, не забыть сделать явную оговорку об этом. Или модифицировать так:
Код: sql
1.
2.
3.
4.
5.
SELECT LEAST(g1.id, g2.id) id1, GREATEST(g1.id, g2.id) id2
FROM goods g1
INNER JOIN goods g2 ON g1.name = g2.name
WHERE g1.id <> g2.id
GROUP BY LEAST(g1.id, g2.id), GREATEST(g1.id, g2.id)


Но он делает больше лишней работы по сравнению с первым вариантом, т.е. выполняться будет дольше.


ради прикола:

select group_concat(id), name
from tbl
group by name
...
Рейтинг: 0 / 0
Задача от yandex
    #38884650
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcselect group_concat(id), name
from tbl
group by nameУ меня была такая мысль. Но потом подумал, что результат group_concat придется нарезать на уникальные пары и додумывать ее не стал.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Задача от yandex
    #39262559
Ichy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение в итоге прокатило?)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Задача от yandex
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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