ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #21  
Старый 27.06.2008, 22:57
VDShark
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме:
804931

Репутация: 526
По умолчанию

Цитата:
Сообщение от Red_Red1  
VDShark, я так понимаю нашли решение не такое как у тебя, ты писал что решил без подзапросов?
Да... у меня там самосоединение было + условная конструкция =)
 
Ответить с цитированием

  #22  
Старый 27.06.2008, 23:14
VDShark
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме:
804931

Репутация: 526
По умолчанию

Цитата:
Сообщение от Red_Red1  
Хотелось бы еще со столь же простым условием и столь же захватывающее по поиску решения
Ну... коль никто не пишет - предложу еще одну задачку. Не такая интересная как предыдущая - но здесь задачка немног другая - максимально упростить решение.
Только что придумал условия - но прием, применяемый в данной задаче, достаточно распространенный.


Вот дамп базы:
Код:
--
-- Структура таблицы `fruits`
--

CREATE TABLE IF NOT EXISTS `fruits` (
  `name` varchar(50) NOT NULL,
  PRIMARY KEY  (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

--
-- Дамп данных таблицы `fruits`
--

INSERT INTO `fruits` (`name`) VALUES
('apple'),
('banana'),
('orange'),
('pear');
Задача следующая: получить все пары значений (т.е. в результирующей выборке будет 2 столбца), подпадающие под след. условия:
1) Одного и того же фрукта в обоих столбцах быть не должно
2) Кортежи, в которых ячейки поменяны местами считаются одинаковыми. Т.е. если у нас есть
------------------
| banana | apple |
------------------
то
------------------
| apple | banana |
------------------
уже быть не должно

Ждем максимально компактного решения
 
Ответить с цитированием

Вот так!
  #23  
Старый 30.06.2008, 09:05
z3r0cool
Познающий
Регистрация: 22.04.2008
Сообщений: 32
Провел на форуме:
137918

Репутация: 56
Отправить сообщение для z3r0cool с помощью ICQ
Smile Вот так!

Код:
SELECT *
	FROM fruits AS f1
		JOIN fruits AS f2 ON f2.name > f1.name
	ORDER BY f1.name
 
Ответить с цитированием

  #24  
Старый 30.06.2008, 09:34
VDShark
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме:
804931

Репутация: 526
По умолчанию

Цитата:
Сообщение от z3r0cool  
Код:
SELECT *
	FROM fruits AS f1
		JOIN fruits AS f2 ON f2.name > f1.name
	ORDER BY f1.name
Да, молодец... В общем правильный подход.
Только
Код:
SELECT *
FROM `fruits` as `f1`,`fruits` as `f2`
WHERE `f1`.`name`>`f2`.`name`
данный код (через декартово произведение) в этом конкретном случае отработает чуточку быстрее (0.0003 сек. против 0.0008 сек).
Хотя с увеличением таблицы эта разница конечно же будет незаметна, а при некоторой оптимизации скорее всего будет обратная ситуация
 
Ответить с цитированием

  #25  
Старый 19.09.2008, 16:32
VDShark
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме:
804931

Репутация: 526
По умолчанию

Помню первая задача из этой темки вызвала ажиотаж в свое время Итак, недавно свой взгляд на данную задачу опубликовал один mvp... Думаю тем кто решал данную задачку, будет интересно посмотреть:

"Как объединить данные из двух столбцов в один без использования UNION и JOIN?"
 
Ответить с цитированием

  #26  
Старый 19.09.2008, 19:05
MasterMushi
Новичок
Регистрация: 19.12.2007
Сообщений: 29
Провел на форуме:
35267

Репутация: 25
По умолчанию

Я так до конца и не понял как красиво решить задачу с компутерными кусками. Хотябы проще возьмем из моей практики. Есть 2 таблицы.

В одной написаны
Id | Id_Получатель | Id_Отправитель | Текст сообщения

Во второй
Id | Имя.

Нужно на выходе получить структуру
Id_сообщения | Имя 1 отправителя | Имя 2 получателя | Текст сообщения

Как сделать такую выборку единым запросом?
 
Ответить с цитированием

  #27  
Старый 22.09.2008, 12:52
VDShark
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме:
804931

Репутация: 526
По умолчанию

Цитата:
Сообщение от MasterMushi  
Я так до конца и не понял как красиво решить задачу с компутерными кусками. Хотябы проще возьмем из моей практики. Есть 2 таблицы.

В одной написаны
Id | Id_Получатель | Id_Отправитель | Текст сообщения

Во второй
Id | Имя.

Нужно на выходе получить структуру
Id_сообщения | Имя 1 отправителя | Имя 2 получателя | Текст сообщения

Как сделать такую выборку единым запросом?
В твоем приме ничего нетривиального нет А для таких вопросов существует спец. топик, с вопросами по sql... Так что просьба не захламлять топик =\
 
Ответить с цитированием

  #28  
Старый 09.09.2009, 22:40
VDShark
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме:
804931

Репутация: 526
По умолчанию

Давно никто ничего не выкладывал здесь. А жаль. Разминка для мозга полезна
Ну что ж - выложу небольшую задачку. Она достаточно проста, но как говорится на безрыбье... В общем вы поняли =)
На данную задачку меня натолкнул следующий факт: все чащи люди неправильно проектируют структуру БД, а потом страдают.
Возьмем пример:
Код:
login     |     param     |   value
--------------------------------------
Alex      |   City        |   London
Alex      |   RegDate     |   22-04-2009
Alex      |   Email       |   aswer@yahoo.com
Nata      |   City        |   Paris
Nata      |   RegDate     |   15-07-2009
Nata      |   Email       |   dser@mail.com
Налицо безграмотнейшее составление структуры. Отношение не находится даже в 1НФ.
И как следствие у людей начинаются большие проблемы с составлением запросов =)
И начинают они плакаться в соцсетях с просьбами о помощи.
Так вот - нормальную структуру, допустим, выяснили, осталось сконвертить для нее данные.
Структура:
Код:
login | city | regdate | email
Т.е. задача состоит в том, что бы из вышеприведенной таблички одним запросом получить данные в формате, приведенном выше.

Дамп базы (для ленивых, что б не создавать структуру и не писать инсерты):
Код:
CREATE TABLE IF NOT EXISTS `tst` (
  `login` varchar(20) NOT NULL DEFAULT '',
  `param` varchar(10) NOT NULL DEFAULT '',
  `value` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`login`,`param`)
);

INSERT INTO `tst` (`login`, `param`, `value`) VALUES
('Alex', 'City', 'London'),
('Alex', 'Email', 'aswer@yahoo.com'),
('Alex', 'RegDate', '22-04-2009'),
('Nata', 'City', 'Paris'),
('Nata', 'Email', 'dser@mail.com'),
('Nata', 'RegDate', '15-07-2009');
Задача решается не одним способом =) Итак - разомните мозги, отложите на минутку свой "набор кавычек".
 
Ответить с цитированием

  #29  
Старый 09.09.2009, 23:44
oRb
Members of Antichat - Level 5
Регистрация: 09.05.2008
Сообщений: 304
Провел на форуме:
7875940

Репутация: 2362
По умолчанию

Код:
mysql> SELECT t1.login, t1.value as city, t2.value as regdate, t3.value as email FROM `tst` t1
    -> LEFT JOIN `tst` t2 ON t1.login = t2.login AND t2.param='regdate'
    -> LEFT JOIN `tst` t3 ON t1.login = t3.login AND t3.param='email'
    -> GROUP BY t1.login;
+-------+--------+------------+-----------------+
| login | city   | regdate    | email           |
+-------+--------+------------+-----------------+
| Alex  | London | 22-04-2009 | aswer@yahoo.com | 
| Nata  | Paris  | 15-07-2009 | dser@mail.com   | 
+-------+--------+------------+-----------------+
2 rows in set (0,00 sec)
Код:
mysql> SELECT login,
    -> (SELECT `value` FROM `tst` WHERE `login`=t1.login AND `param`='city') as city,
    -> (SELECT `value` FROM `tst` WHERE `login`=t1.login AND `param`='regdate') as regdate,
    -> (SELECT `value` FROM `tst` WHERE `login`=t1.login AND `param`='email') as email
    -> FROM `tst` t1
    -> GROUP BY `login`;
+-------+--------+------------+-----------------+
| login | city   | regdate    | email           |
+-------+--------+------------+-----------------+
| Alex  | London | 22-04-2009 | aswer@yahoo.com | 
| Nata  | Paris  | 15-07-2009 | dser@mail.com   | 
+-------+--------+------------+-----------------+
2 rows in set (0,01 sec)
__________________
включи голову
 
Ответить с цитированием

  #30  
Старый 10.09.2009, 00:48
VDShark
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме:
804931

Репутация: 526
По умолчанию

oRb - молодец.
Остальные - еще остались способы =) Пишем - не стесняемся
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обнаружение Sql инъекций в Oracle, часть первая k00p3r Чужие Статьи 1 12.07.2005 08:51
Обнаружение Sql инъекций в Oracle, часть вторая k00p3r Чужие Статьи 0 13.06.2005 11:26
Sql инъекция и Oracle, часть первая k00p3r Чужие Статьи 0 13.06.2005 11:23
Внедрение Sql кода с завязанными глазами k00p3r Чужие Статьи 0 12.06.2005 20:48
SQL Injection в Oracle k00p3r Чужие Статьи 0 12.06.2005 12:41



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ