Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Нетривиальные задачи Sql (https://forum.antichat.xyz/showthread.php?t=75032)

VDShark 26.06.2008 00:23

Нетривиальные задачи Sql
 
Предлагаю выкладывать в данной теме интересные, неоднозначные задачки, заставляющие моск пошевилиться :)
Новичкам будет полезно почитать и поучится, а ветеранам в этом нелегком деле - поулучшать и попредлагать свои варианты решения.

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

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

К примеру:

Код:

--------------------
        tbl
--------------------
    st1  |  st2
--------------------
    a    |    e   
    d    |    g   
    r    |    k

Так вот - необходимо НЕ используя UNION получить в результирующей выборке содержимое 2-х столбцов в одном столбце, упорядоченным по возрастанию.

Т.е.
Код:

---------
 result
---------
  a   
  d
  e
  g
  k     
  r

Запрос вовсе не сложный, но если сразу не догадаться как решать - можно потратить некоторое время на обдумывание :)

Не было - ну да ладн :)
Код:

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');


.Slip 26.06.2008 00:38

Кидай сразу код для создания таблицы и заполнения колонок. А то буковки впадлу переписывать

Solker 26.06.2008 03:59

Пойдет?
Код:

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;


VDShark 26.06.2008 11:25

Цитата:

Сообщение от Solker
Пойдет?
Код:

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;


Ну.... Никакого полета фантазии :)
Давай без временных таблиц.
Тем более что это все сделать необходимо одним запросом.

guest3297 26.06.2008 14:58

подзапросы тоже нельзя?

z3r0cool 26.06.2008 15:33

Использовать представления (VIEW), хранимые функции...?
Собственно эти объекты и предназначены для решения проблем такого рода.

VDShark 26.06.2008 16:50

Цитата:

Сообщение от [ cash ]
подзапросы тоже нельзя?

Можно. Хотя я без них решил :)

Цитата:

Сообщение от z3r0cool
Использовать представления (VIEW), хранимые функции...?
Собственно эти объекты и предназначены для решения проблем такого рода.

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

На самом деле запрос достаточно легкий... главное догадаться каким путем идти.

-=lebed=- 26.06.2008 17:21

Цитата:

Сообщение от VDShark
На самом деле запрос достаточно легкий... главное догадаться каким путем идти.

Модифицировать исходную таблицу можно? Создавать дополнительные я так понял нельзя...

VDShark 26.06.2008 17:36

Цитата:

Сообщение от -=lebed=-
Модифицировать исходную таблицу можно? Создавать дополнительные я так понял нельзя...

Нет. Никаких DML и тп... Только запрос на выборку. Т.е. select и присущие ему конструкции: можно подзапросы, JOIN'ы, самосоединения и тп.

Solker 27.06.2008 19:10

На тему большинство забило, я же 3 дня листал мануалы на mysql.com.
Будте добрвы выскажите тогда пожалуйста наиболее оптимальное решение.
Очень интересно.


Время: 19:35