Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

27.06.2008, 22:57
|
|
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме: 804931
Репутация:
526
|
|
Сообщение от Red_Red1
VDShark, я так понимаю нашли решение не такое как у тебя, ты писал что решил без подзапросов?
Да... у меня там самосоединение было + условная конструкция =)
|
|
|

27.06.2008, 23:14
|
|
Участник форума
Регистрация: 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 |
------------------
уже быть не должно
Ждем максимально компактного решения 
|
|
|

30.06.2008, 09:05
|
|
Познающий
Регистрация: 22.04.2008
Сообщений: 32
Провел на форуме: 137918
Репутация:
56
|
|
Вот так!
Код:
SELECT *
FROM fruits AS f1
JOIN fruits AS f2 ON f2.name > f1.name
ORDER BY f1.name
|
|
|

30.06.2008, 09:34
|
|
Участник форума
Регистрация: 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 сек).
Хотя с увеличением таблицы эта разница конечно же будет незаметна, а при некоторой оптимизации скорее всего будет обратная ситуация 
|
|
|

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

19.09.2008, 19:05
|
|
Новичок
Регистрация: 19.12.2007
Сообщений: 29
Провел на форуме: 35267
Репутация:
25
|
|
Я так до конца и не понял как красиво решить задачу с компутерными кусками. Хотябы проще возьмем из моей практики. Есть 2 таблицы.
В одной написаны
Id | Id_Получатель | Id_Отправитель | Текст сообщения
Во второй
Id | Имя.
Нужно на выходе получить структуру
Id_сообщения | Имя 1 отправителя | Имя 2 получателя | Текст сообщения
Как сделать такую выборку единым запросом?
|
|
|

22.09.2008, 12:52
|
|
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме: 804931
Репутация:
526
|
|
Сообщение от MasterMushi
Я так до конца и не понял как красиво решить задачу с компутерными кусками. Хотябы проще возьмем из моей практики. Есть 2 таблицы.
В одной написаны
Id | Id_Получатель | Id_Отправитель | Текст сообщения
Во второй
Id | Имя.
Нужно на выходе получить структуру
Id_сообщения | Имя 1 отправителя | Имя 2 получателя | Текст сообщения
Как сделать такую выборку единым запросом?
В твоем приме ничего нетривиального нет  А для таких вопросов существует спец. топик, с вопросами по sql... Так что просьба не захламлять топик =\
|
|
|

09.09.2009, 22:40
|
|
Участник форума
Регистрация: 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');
Задача решается не одним способом =) Итак - разомните мозги, отложите на минутку свой "набор кавычек".
|
|
|

09.09.2009, 23:44
|
|
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)
__________________
включи голову
|
|
|

10.09.2009, 00:48
|
|
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме: 804931
Репутация:
526
|
|
oRb - молодец.
Остальные - еще остались способы =) Пишем - не стесняемся 
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|