Нетривиальные задачи Sql

Discussion in 'PHP' started by VDShark, 26 Jun 2008.

  1. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Предлагаю выкладывать в данной теме интересные, неоднозначные задачки, заставляющие моск пошевилиться :)
    Новичкам будет полезно почитать и поучится, а ветеранам в этом нелегком деле - поулучшать и попредлагать свои варианты решения.

    Для примера приведу задачку, котороя мне сегодня попалась (друг спросил):

    Есть таблица, назовем ее tbl, в ней 2 столбца: st1 и st2. В каждом из столбцов какой то набор букв.

    К примеру:

    Code:
    --------------------
             tbl
    --------------------
        st1   |   st2
    --------------------
         a    |     e     
         d    |     g     
         r    |     k       
    
    Так вот - необходимо НЕ используя UNION получить в результирующей выборке содержимое 2-х столбцов в одном столбце, упорядоченным по возрастанию.

    Т.е.
    Code:
    ---------
     result 
    ---------
       a     
       d
       e
       g
       k       
       r       
    
    Запрос вовсе не сложный, но если сразу не догадаться как решать - можно потратить некоторое время на обдумывание :)

    Не было - ну да ладн :)
    Code:
    CREATE TABLE `tst` (
      `st1` varchar(1) NOT NULL,
      `st2` varchar(1) NOT NULL
    );
    
    INSERT INTO `tst` (`st1`, `st2`) VALUES
    ('a', 'e'),
    ('d', 'g'),
    ('r', 'k');
    
     
    #1 VDShark, 26 Jun 2008
    Last edited: 26 Jun 2008
    3 people like this.
  2. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Кидай сразу код для создания таблицы и заполнения колонок. А то буковки впадлу переписывать
     
    1 person likes this.
  3. Solker

    Solker Elder - Старейшина

    Joined:
    4 May 2006
    Messages:
    175
    Likes Received:
    53
    Reputations:
    18
    Пойдет?
    Code:
    CREATE TEMPORARY TABLE temp TYPE=HEAP SELECT st1 as 'result' FROM tst;
    INSERT INTO temp SELECT st2 FROM tst;
    SELECT * FROM temp ORDER BY 'result' ASC;
    DROP TABLE temp;
     
    1 person likes this.
  4. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Ну.... Никакого полета фантазии :)
    Давай без временных таблиц.
    Тем более что это все сделать необходимо одним запросом.
     
    1 person likes this.
  5. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    подзапросы тоже нельзя?
     
  6. z3r0cool

    z3r0cool Elder - Старейшина

    Joined:
    22 Apr 2008
    Messages:
    32
    Likes Received:
    11
    Reputations:
    0
    Использовать представления (VIEW), хранимые функции...?
    Собственно эти объекты и предназначены для решения проблем такого рода.
     
    #6 z3r0cool, 26 Jun 2008
    Last edited: 26 Jun 2008
  7. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Можно. Хотя я без них решил :)

    Нет-нет-нет и еще раз нет... Тем более в основе представления так же лежит запрос - какая собственно разница? А в хп обычно группа запросов. Я ж написал - ЗАПРОС... 1 запрос. Ну максимум с подзапросами. А вы тут начали уже городить =)

    На самом деле запрос достаточно легкий... главное догадаться каким путем идти.
     
    #7 VDShark, 26 Jun 2008
    Last edited: 26 Jun 2008
    1 person likes this.
  8. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    Модифицировать исходную таблицу можно? Создавать дополнительные я так понял нельзя...
     
    1 person likes this.
  9. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Нет. Никаких DML и тп... Только запрос на выборку. Т.е. select и присущие ему конструкции: можно подзапросы, JOIN'ы, самосоединения и тп.
     
  10. Solker

    Solker Elder - Старейшина

    Joined:
    4 May 2006
    Messages:
    175
    Likes Received:
    53
    Reputations:
    18
    На тему большинство забило, я же 3 дня листал мануалы на mysql.com.
    Будте добрвы выскажите тогда пожалуйста наиболее оптимальное решение.
    Очень интересно.
     
  11. Naydav

    Naydav Elder - Старейшина

    Joined:
    30 Dec 2006
    Messages:
    439
    Likes Received:
    63
    Reputations:
    4
    Рано еще :)
     
  12. ENFIX

    ENFIX Elder - Старейшина

    Joined:
    6 Jun 2006
    Messages:
    175
    Likes Received:
    122
    Reputations:
    75
    Code:
    select concat_ws('\n', st1, st2) as result from tst;
    
    так нельзя?)
     
  13. Solker

    Solker Elder - Старейшина

    Joined:
    4 May 2006
    Messages:
    175
    Likes Received:
    53
    Reputations:
    18
    Всеровно получается, c точки зрения SQL, в одной строчке по 2 буквы.
     
  14. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Это даже костылями назвать сложно :)

    Да... наверное на задачку забили. Я сам минут 20 фтыкал, когда мне ее задли... сначала хотел сказать "Низя!", но посидел подумал... и вышел на верное направление :) Не исключаю что способ решения не один.
    Если уж совсем не в моготу будет - могу подсказку сказать... правда думаю это практически решение :)
     
  15. Naydav

    Naydav Elder - Старейшина

    Joined:
    30 Dec 2006
    Messages:
    439
    Likes Received:
    63
    Reputations:
    4
    та уже нашли ответ :)
    точно наши,
    где они уж не наши не бывали...
     
    #15 Naydav, 27 Jun 2008
    Last edited: 27 Jun 2008
    2 people like this.
  16. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Да, молодца :) Можно канешн оттачивать само решение - но направление правильное найдено - использовать условия ;)
     
  17. Naydav

    Naydav Elder - Старейшина

    Joined:
    30 Dec 2006
    Messages:
    439
    Likes Received:
    63
    Reputations:
    4
    Задача:
    Вопрос:
    Результат правильного выполнения упражнения:
    Например
    Задачи на подобии такой на
    http://sql-ex.ru/index.php
    Там просто орвет в текстареа пишешь и смотришь резалт
    2 этапа : обучающий, сертификационный
    вопросов 40 наверно

    пс
    Там косячит регистрация, но есть кнопка - вход без регистрации
     
    #17 Naydav, 27 Jun 2008
    Last edited: 27 Jun 2008
    1 person likes this.
  18. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Ничего нетривиального в данной задаче не вижу :)
    Я сейчас занимаюсь расширением функциональности и поддержкой данного проекта :) Не мог бы ты отписать что там именно косячит? Либо в личку, либо через форму обратной связи.

    P.S. Этапа там не два а три.
     
    #18 VDShark, 27 Jun 2008
    Last edited: 27 Jun 2008
  19. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    Извините почти оффтоп...
    Может и забили но не все... жаль что неуспел решить :(:(, а то что тема упала, так это потому что нечего было писать так как в наверное были в поисках решения.
    VDShark, я так понимаю нашли решение не такое как у тебя, ты писал что решил без подзапросов?
    Хотелось бы еще со столь же простым условием и столь же захватывающее по поиску решения :)
     
  20. Naydav

    Naydav Elder - Старейшина

    Joined:
    30 Dec 2006
    Messages:
    439
    Likes Received:
    63
    Reputations:
    4
    VDShark
    Написал в личку