Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Интересные задачи по SQL

Страниц (2): [1] 2 »
 

1. Champion - 03 Июля, 2011 - 19:09:08 - перейти к сообщению
Наткнулся на очень интересный для SQLщиков(и профи, и новичков) ресурс.
http://www[dot]sql-ex[dot]ru - вот такой.
Большая куча литературы с примерами, с разбором заковыристых запросов, всякие интересные замысловатые задачки по SQL и DML, по оптимизации, рейтинги, сертификаты. Вот.
2. OrmaJever - 03 Июля, 2011 - 19:38:10 - перейти к сообщению
Спасибо! Всегда хотел sql подтянуть Улыбка
3. komprenda - 05 Июля, 2011 - 17:00:00 - перейти к сообщению
не работает
4. Champion - 05 Июля, 2011 - 18:07:38 - перейти к сообщению
Да, что-то второй вечер уже сам зайти не могу. Они вроде на др. хостинг переезжают.
(Добавление)
Ожили
5. LIME - 29 Сентября, 2011 - 22:06:07 - перейти к сообщению
Champion вот тогда вопрос по http://www[dot]sql-ex[dot]ru/learn_exercises.php?LN=7
решил так
чтото както многовато мне кажется
можно лучше решить?
(Добавление)
а за ресурс спасибо!
6. Champion - 30 Сентября, 2011 - 21:38:10 - перейти к сообщению
Самое очевидное и ничем не плохое решение.
Только не стоит публиковать решения на сторонних форумах и точно так же не стоит публиковать формулировки задач. Особенно, когда речь пойдет о рейтинговых задачах.
Если есть вопрос, по задаче, его лучше задать в поддержку.
К тому же, раз задача решена, то доступно ее обсуждение - вот там можно опубликовать свое решение и полюбоваться другими
LIME пишет:
а за ресурс спасибо!
Это не мне спасибо)
7. LIME - 30 Сентября, 2011 - 21:41:34 - перейти к сообщению
Champion неужели так серьезно? ))
ок ...я понял ... спасибо
8. Champion - 30 Сентября, 2011 - 21:50:36 - перейти к сообщению
LIME пишет:
Champion неужели так серьезно? ))
Ну за публикации рейтинговых задач полагается бан. Причем такие публикации, что интересно, отлавливаются весьма неплохо вместе с авторами Улыбка
9. koras - 18 Декабря, 2011 - 11:57:17 - перейти к сообщению
Не по теме сказано, но ресурс принадлежит моему очень хорошему другу. Сам ресур не приследует коммерческого интереса, все ради того чтобы принести пользу.
10. LIME - 19 Декабря, 2011 - 15:26:48 - перейти к сообщению
koras попроси друга починить регистрацию пжлст))
уже месяц наверное жду подтверждения ((
(Добавление)
korasотбой Радость получилось востановление хотя подтверждения не было ))
11. EuGen - 09 Июня, 2012 - 11:34:23 - перейти к сообщению
Дано: таблица со структурой id int(11), name varchar(255). Заполнена примерно таким образом:
CODE (htmlphp):
скопировать код в буфер обмена
  1. id      name
  2. 1       Первый
  3. 2       Второй
  4. 5       Третий
  5. 6       Четвертый
  6. 7       Пятый
  7. 8       Шестой
  8. 9       Седьмой
  9. 13      Восьмой
  10. 14      Девятый
  11. 15      Десятый

Задача - не используя специальных средств СУБД (только доступные SQL-операторы и функции) сделать присоединение (JOIN) таблицы саму на себя, с тем, чтобы присоединенные строки встали в обратном порядке. То есть результат должен содержать следующее:
CODE (htmlphp):
скопировать код в буфер обмена
  1. left_id         name    right_id        name
  2. 1       Первый          15      Десятый
  3. 2       Второй          14      Девятый
  4. 5       Третий          13      Восьмой
  5. 6       Четвертый       9       Седьмой
  6. 7       Пятый   8       Шестой
  7. 8       Шестой          7       Пятый
  8. 9       Седьмой         6       Четвертый
  9. 13      Восьмой         5       Третий
  10. 14      Девятый         2       Второй
  11. 15      Десятый         1       Первый


Решение, получившееся у меня (некрасивое)
Спойлер (Отобразить)
12. Мелкий - 09 Июня, 2012 - 12:31:31 - перейти к сообщению
Вне конкурса, т.к. не удовлетворяю условию. Просто любопытны стали более штатные средства:
Спойлер (Отобразить)

Спойлер (Отобразить)
13. Champion - 09 Июня, 2012 - 13:14:26 - перейти к сообщению
Вот такой вариант номер один:
Спойлер (Отобразить)

group_concat / list / for xml path - есть практически везде, так что наверное им можно пользоваться. Количество юнионов зависит от количества строк, что не очень приятно. Хотя эту последовательность можно генерить. Вот такие минусы. Зато плюс: на моих данных (250 строк) Ваше решение выполняется 2.5с, а моё всего 0.167.

Вариант 2 - пронумеровать строки переменными и сджойнить (написал Мелкий).

Вариант 3 - пронумеровать подзапросом и также сджойнить. Сейчас напишу и померяю
(Добавление)
Спойлер (Отобразить)
А этот неожиданно выполнился за 0.016
(Добавление)
И за 5с на 2000 записей.
14. DeepVarvar - 09 Июня, 2012 - 13:40:22 - перейти к сообщению
Еще вариант:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT l.name, r.name
  2.   FROM tbl l
  3.   LEFT JOIN tbl r ON r.id = ((SELECT COUNT(1) FROM tbl) + 1 - l.id)
15. Мелкий - 09 Июня, 2012 - 13:46:25 - перейти к сообщению
DeepVarvar, правильно сджойнится только на монотонном изменении id, в задаче id идёт с пропусками.

Champion, хороший вариант.

 

Powered by ExBB FM 1.0 RC1