Помогите с запросом!

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
armadex
мл. сержант
Сообщения: 111
Зарегистрирован: 2007-11-07 21:29:33
Откуда: Ukraine, Кривой Рог
Контактная информация:

Помогите с запросом!

Непрочитанное сообщение armadex » 2009-05-06 15:01:30

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `users` (
  `uid` bigint(20) unsigned NOT NULL,
  `username` varchar(64) COLLATE utf8_bin NOT NULL,
  `password` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '*',
  `auth_info` varchar(64) COLLATE utf8_bin NOT NULL,
  `auth_type` tinyint(1) NOT NULL COMMENT 'тип проверки',
  `active` varchar(254) COLLATE utf8_bin NOT NULL COMMENT 'активен',
  `user_ip` varchar(16) COLLATE utf8_bin NOT NULL COMMENT 'ip юзера',
  `user_mac` varchar(18) COLLATE utf8_bin NOT NULL COMMENT 'mac юзера',
  PRIMARY KEY (`uid`),
  KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='пользователи';
Как сделать выборку, если:
auth_type = 0 то выбирать только из полей username, password
auth_type = 1 то выбирать username,password,user_ip
auth_type = 2 то выбирать username,password,user_ip,user_mac

И вообще возможно ли такое в 1м запросе?
Автор благодарит алфавит за любезно предоставленные буквы!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Помогите с запросом!

Непрочитанное сообщение zg » 2009-05-06 15:03:09

armadex писал(а):И вообще возможно ли такое в 1м запросе?
да, только смысла мало. Проще выбирать все поля и использовать только нужные

Аватара пользователя
armadex
мл. сержант
Сообщения: 111
Зарегистрирован: 2007-11-07 21:29:33
Откуда: Ukraine, Кривой Рог
Контактная информация:

Re: Помогите с запросом!

Непрочитанное сообщение armadex » 2009-05-06 15:06:47

а пример можно? смысл в этом есть
Автор благодарит алфавит за любезно предоставленные буквы!

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Помогите с запросом!

Непрочитанное сообщение zg » 2009-05-06 15:16:45

<em>armadex</em> писал(а):а пример можно?

Код: Выделить всё

mysql> create table test (t int, v1 varchar(60), v2 varchar(60));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test values(1, "value1 - 1", "value2 - 1");
Query OK, 1 row affected (0.02 sec)

mysql> insert into test values(2, "value1 - 2", "value2 - 2");
Query OK, 1 row affected (0.00 sec)

mysql> select t, if(t = 1, v1, v2) from test;
+------+-------------------+
| t    | if(t = 1, v1, v2) |
+------+-------------------+
|    1 | value1 - 1        |
|    2 | value2 - 2        |
+------+-------------------+
2 rows in set (0.02 sec)

mysql>

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Помогите с запросом!

Непрочитанное сообщение zg » 2009-05-06 15:25:34

ещё есть такая полезность http://dev.mysql.com/doc/refman/5.1/en/ ... rator_case

Код: Выделить всё

mysql> SELECT CASE 1 WHEN 1 THEN 'one'
    ->     WHEN 2 THEN 'two' ELSE 'more' END;
        -> 'one'
mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
        -> 'true'
mysql> SELECT CASE BINARY 'B'
    ->     WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
        -> NULL

Аватара пользователя
armadex
мл. сержант
Сообщения: 111
Зарегистрирован: 2007-11-07 21:29:33
Откуда: Ukraine, Кривой Рог
Контактная информация:

Re: Помогите с запросом!

Непрочитанное сообщение armadex » 2009-05-15 19:32:26

а возможно ли использовать оператор AS совместно с CASE? точнее внутри
Автор благодарит алфавит за любезно предоставленные буквы!

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Помогите с запросом!

Непрочитанное сообщение zg » 2009-05-15 19:34:48

armadex писал(а):точнее внутри
как именно и с какой целью?

Аватара пользователя
armadex
мл. сержант
Сообщения: 111
Зарегистрирован: 2007-11-07 21:29:33
Откуда: Ukraine, Кривой Рог
Контактная информация:

Re: Помогите с запросом!

Непрочитанное сообщение armadex » 2009-05-15 19:54:13

для freeradius

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `users2` (
  `uid` bigint(20) unsigned NOT NULL,
  `username` varchar(64) COLLATE utf8_bin NOT NULL,
  `password` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '*',
  `auth_info` varchar(64) COLLATE utf8_bin NOT NULL,
  `auth_type` tinyint(1) NOT NULL COMMENT 'тип проверки',
  `active` varchar(254) COLLATE utf8_bin NOT NULL COMMENT 'активен',
  `user_ip` varchar(16) COLLATE utf8_bin NOT NULL COMMENT 'ip юзера',
  `user_mac` varchar(18) COLLATE utf8_bin NOT NULL COMMENT 'mac юзера',
  PRIMARY KEY (`uid`),
  KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='пользователи';

INSERT INTO `users2` (`uid`, `username`, `password`, `auth_info`, `auth_type`, `active`, `user_ip`, `user_mac`) VALUES
(1, 'user1', 'passwd1', '172.24.32.2 / 00:1f:c6:15:19:d0', 1, '1', '200.200.250.3', '00:01:00:00:00:00'),
(2, 'user2', 'passwd2', '', 0, '1', '200.200.250.4', 'zz:xz:zz:zz:zz');
сделал запрос

Код: Выделить всё

SELECT uid, username, 'Cleartext-Password' as 'attribute', password as 'value', '==' as 'op', 'Calling-Station-Id' as 'attribute', (CASE auth_type WHEN '1' THEN auth_info WHEN '0' THEN '' ELSE NULL END) as 'value', '==' as 'op' FROM users2;
получил для auth_type=1 так и нужно
Изображение
но для auth_type=0 нужно выбрать так(то есть без attribute - Calling-Station-Id)
Изображение
Автор благодарит алфавит за любезно предоставленные буквы!

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Помогите с запросом!

Непрочитанное сообщение zg » 2009-05-15 20:07:15

armadex писал(а):но для auth_type=0 нужно выбрать так(то есть без attribute - Calling-Station-Id)
это противоречит логие mysql. Количество столбцов всегда постоянно и от запроса не зависит.

Аватара пользователя
armadex
мл. сержант
Сообщения: 111
Зарегистрирован: 2007-11-07 21:29:33
Откуда: Ukraine, Кривой Рог
Контактная информация:

Re: Помогите с запросом!

Непрочитанное сообщение armadex » 2009-05-15 20:56:49

а в PostgreSQL такое возможно?
Автор благодарит алфавит за любезно предоставленные буквы!

Sla
мл. сержант
Сообщения: 73
Зарегистрирован: 2008-08-19 15:09:19

Re: Помогите с запросом!

Непрочитанное сообщение Sla » 2009-05-15 23:51:49

возможно, но с извращением

Код: Выделить всё

select field1,
        CASE field2
    ->       WHEN '1' THEN field3 . '"|" field4"'
    ->       WHEN '2' THENfield3
from table
но как было сказано, количество столбцов ВСЕГДА одинаково!