Страница 1 из 1

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

Добавлено: 2009-05-06 15:01:30
armadex

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

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м запросе?

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

Добавлено: 2009-05-06 15:03:09
zg
armadex писал(а):И вообще возможно ли такое в 1м запросе?
да, только смысла мало. Проще выбирать все поля и использовать только нужные

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

Добавлено: 2009-05-06 15:06:47
armadex
а пример можно? смысл в этом есть

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

Добавлено: 2009-05-06 15:16:45
zg
<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>

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

Добавлено: 2009-05-06 15:25:34
zg
ещё есть такая полезность 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

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

Добавлено: 2009-05-15 19:32:26
armadex
а возможно ли использовать оператор AS совместно с CASE? точнее внутри

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

Добавлено: 2009-05-15 19:34:48
zg
armadex писал(а):точнее внутри
как именно и с какой целью?

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

Добавлено: 2009-05-15 19:54:13
armadex
для 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)
Изображение

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

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

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

Добавлено: 2009-05-15 20:56:49
armadex
а в PostgreSQL такое возможно?

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

Добавлено: 2009-05-15 23:51:49
Sla
возможно, но с извращением

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

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