Задача от yandex.
Есть таблица товаров. Нужно написать SQL-запрос для вывода пар id товаров с одинаковыми именами.
CREATE TABLE `goods` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
Она содержит следующие значения:
id | name |
1 | Яблоки |
2 | Яблоки |
3 | Груши |
4 | Яблоки |
5 | Апельсины |
6 | Груши |
insert into goods values(1, 'яблоки'),(2, 'яблоки'),(3, 'груши'),(4,'яблоки'),(5, 'апельсины'), (6, 'груши');
Напишите запрос, выбирающий уникальные пары `id` товаров с одинаковыми `name`, например: (1,2), (4,1), (2,4), (6,3).
При решении задачи необходимо учесть, что пары (x,y) и (y,x) — одинаковы. Приведите несколько вариантов решения задачи, какой вариант будет работать быстрее? Почему?
Решение задачи
На данный момент у меня есть 2 варианта решения задачи, но, решения могут быть не оптимальными:
SELECT g1.id,g2.id FROM goods g1 INNER JOIN goods g2 ON g1.name=g2.name WHERE g1.id<g2.id;
SELECT g1.id,g2.id FROM goods g1, goods g2 WHERE g1.name=g2.name AND g1.id < g2.id;
Суровый explain:
mysql> EXPLAIN EXTENDED SELECT g1.id,g2.id FROM goods g1, goods g2 WHERE g1.name=g2.name AND g1.id < g2.id; +----+-------------+-------+------+---------------+------+---------+------+------+----------+------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+----------+------------------------------------------------+ | 1 | SIMPLE | g1 | ALL | PRIMARY | NULL | NULL | NULL | 6 | 100.00 | NULL | | 1 | SIMPLE | g2 | ALL | PRIMARY | NULL | NULL | NULL | 6 | 100.00 | Range checked for each record (index map: 0x1) | +----+-------------+-------+------+---------------+------+---------+------+------+----------+------------------------------------------------+
Если бы по условию задачи можно было выводить одинаковые пары (x,y) и (y,x), то убрав условие сравнения id запрос был бы более менее. Нужно будет еще подумать.
Комментарии 0