![]() |
Нетривиальные задачи Sql
Предлагаю выкладывать в данной теме интересные, неоднозначные задачки, заставляющие моск пошевилиться :)
Новичкам будет полезно почитать и поучится, а ветеранам в этом нелегком деле - поулучшать и попредлагать свои варианты решения. Для примера приведу задачку, котороя мне сегодня попалась (друг спросил): Есть таблица, назовем ее tbl, в ней 2 столбца: st1 и st2. В каждом из столбцов какой то набор букв. К примеру: Код:
--------------------Т.е. Код:
---------Не было - ну да ладн :) Код:
CREATE TABLE `tst` ( |
Кидай сразу код для создания таблицы и заполнения колонок. А то буковки впадлу переписывать
|
Пойдет?
Код:
CREATE TEMPORARY TABLE temp TYPE=HEAP SELECT st1 as 'result' FROM tst; |
Цитата:
Давай без временных таблиц. Тем более что это все сделать необходимо одним запросом. |
подзапросы тоже нельзя?
|
Использовать представления (VIEW), хранимые функции...?
Собственно эти объекты и предназначены для решения проблем такого рода. |
Цитата:
Цитата:
На самом деле запрос достаточно легкий... главное догадаться каким путем идти. |
Цитата:
|
Цитата:
|
На тему большинство забило, я же 3 дня листал мануалы на mysql.com.
Будте добрвы выскажите тогда пожалуйста наиболее оптимальное решение. Очень интересно. |
Цитата:
|
Код:
select concat_ws('\n', st1, st2) as result from tst; |
Цитата:
|
Цитата:
Да... наверное на задачку забили. Я сам минут 20 фтыкал, когда мне ее задли... сначала хотел сказать "Низя!", но посидел подумал... и вышел на верное направление :) Не исключаю что способ решения не один. Если уж совсем не в моготу будет - могу подсказку сказать... правда думаю это практически решение :) |
та уже нашли ответ :)
Цитата:
где они уж не наши не бывали... |
Цитата:
|
Задача:
Цитата:
Цитата:
Например Цитата:
http://sql-ex.ru/index.php Там просто орвет в текстареа пишешь и смотришь резалт 2 этапа : обучающий, сертификационный вопросов 40 наверно пс Там косячит регистрация, но есть кнопка - вход без регистрации |
Ничего нетривиального в данной задаче не вижу :)
Цитата:
P.S. Этапа там не два а три. |
Извините почти оффтоп...
Может и забили но не все... жаль что неуспел решить :(:(, а то что тема упала, так это потому что нечего было писать так как в наверное были в поисках решения. VDShark, я так понимаю нашли решение не такое как у тебя, ты писал что решил без подзапросов? Хотелось бы еще со столь же простым условием и столь же захватывающее по поиску решения :) |
VDShark
Написал в личку |
Цитата:
|
Цитата:
Только что придумал условия - но прием, применяемый в данной задаче, достаточно распространенный. Вот дамп базы: Код:
--1) Одного и того же фрукта в обоих столбцах быть не должно 2) Кортежи, в которых ячейки поменяны местами считаются одинаковыми. Т.е. если у нас есть ------------------ | banana | apple | ------------------ то ------------------ | apple | banana | ------------------ уже быть не должно :) Ждем максимально компактного решения :) |
Вот так!
Код:
SELECT * |
Цитата:
Только Код:
SELECT *Хотя с увеличением таблицы эта разница конечно же будет незаметна, а при некоторой оптимизации скорее всего будет обратная ситуация :) |
Помню первая задача из этой темки вызвала ажиотаж в свое время :) Итак, недавно свой взгляд на данную задачу опубликовал один mvp... Думаю тем кто решал данную задачку, будет интересно посмотреть:
"Как объединить данные из двух столбцов в один без использования UNION и JOIN?" |
Я так до конца и не понял как красиво решить задачу с компутерными кусками. Хотябы проще возьмем из моей практики. Есть 2 таблицы.
В одной написаны Id | Id_Получатель | Id_Отправитель | Текст сообщения Во второй Id | Имя. Нужно на выходе получить структуру Id_сообщения | Имя 1 отправителя | Имя 2 получателя | Текст сообщения Как сделать такую выборку единым запросом? |
Цитата:
|
Давно никто ничего не выкладывал здесь. А жаль. Разминка для мозга полезна ;)
Ну что ж - выложу небольшую задачку. Она достаточно проста, но как говорится на безрыбье... В общем вы поняли =) На данную задачку меня натолкнул следующий факт: все чащи люди неправильно проектируют структуру БД, а потом страдают. Возьмем пример: Код:
login | param | valueИ как следствие у людей начинаются большие проблемы с составлением запросов =) И начинают они плакаться в соцсетях с просьбами о помощи. Так вот - нормальную структуру, допустим, выяснили, осталось сконвертить для нее данные. Структура: Код:
login | city | regdate | emailДамп базы (для ленивых, что б не создавать структуру и не писать инсерты): Код:
CREATE TABLE IF NOT EXISTS `tst` ( |
Код:
mysql> SELECT t1.login, t1.value as city, t2.value as regdate, t3.value as email FROM `tst` t1Код:
mysql> SELECT login, |
oRb - молодец.
Остальные - еще остались способы =) Пишем - не стесняемся :) |
Итак, никто не хочет остальные методы решения для прошлой задачи придумывать - ну и ладно =)
Еще одна задачка. На мой взгляд более интересная. Имеется в наличии такая вот табличка Код:
--------------------------------Пользоваться можно ТОЛЬКО средствами, предусмотренными стандартом SQL-92 (т.е. без всяких rank(), row_number() и подобных функций), а так же без временных таблиц и иже с ними. По хорошему - это один запрос (ну, возможно с коррелирующим подзапросом, но можно сделать и без него). В итоге мы должны получить примерно следующее: Код:
----------------------------------------Код:
CREATE TABLE `tst2` ( |
Неужто никому размять мозги не хочется? Задачка то плевая.
Или все "к0вычк0ми" мозг забили? :) |
нет, ну почему, интересно, просто на практике нафиг такое никогда не понадобиться. Лучше бы чонить жизненное, что могло бы хоть когда нибудь пригодиться.
|
Цитата:
|
<spoiler>
select count(*) as num, current.* from test as current, test where current.model >= test.model group by current.model order by current.model asc </spoiler> |
astrologer - молодец =)
|
На этот раз проверим как у нас обстоят дела с работой со строками.
Задача: есть таблица с единственным полем, в котором записаны cтроки вида Код:
sdfdf_efgregehmtri_ref_WEFEW_reg_regbbТ.е. по вышеприведенной строке должно получится такое: Код:
sdfdf_**************************_regbbКод:
CREATE TABLE IF NOT EXISTS `tst` (upd: естественно как всегда ответ - единственный запрос. Без рекурсий и тп. Так же никаких хп. Ну в общем вы поняли =) |
хз, это, наверно, извращенный метод, но что пришло в голову =)
Код:
select concat_ws('_', |
В принципе ход мысли правильный... Хотя ничего особо сложного в данной задачке нет =) Но все равно молодец)
|
| Время: 06:08 |