SQL-задача от Yandex (для php developer)

Задача от 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 запрос был бы более менее. Нужно будет еще подумать.

 
 
 
 

icon Комментарии 0

Ваш комментарий к статье.. (для авторизованных)

ctrl+enter

icon Вход в систему

зарегистрироваться
НОВЫЕ ПОЛЬЗОВАТЕЛИ