adsl club

Справочник

Форум

Программы

Фильмы

Ресурсы

Файлообмен

Хостинг

Ростелеком
Выбор конкретных строк из MYSQL
На страницу 1 2
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ
Автор Сообщение
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Чт 24-04-08 : 20-44    Заголовок сообщения: Ответить с цитатой

Расскажу подробнее

Таблица с правами и текстовым полем

Код:

--
-- Структура таблицы `fin_relations`
--

CREATE TABLE `fin_relations` (
  `id_pole` int(11) NOT NULL auto_increment,
  `id` int(11) NOT NULL default '0',
  `parentid` int(11) NOT NULL default '0',
  `comment` text NOT NULL,
  `prava` varchar(128) NOT NULL,
  PRIMARY KEY  (`id_pole`),
  KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=42 ;


Вторая таблица

Код:
--
-- Структура таблицы `fin_bank_name`
--

CREATE TABLE `fin_bank_name` (
  `id` int(11) NOT NULL auto_increment,
  `userid` int(11) NOT NULL default '0',
  `bank_name` varchar(255) NOT NULL default '',
  `schet` varchar(255) NOT NULL default '',
  `vladelec` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=8 ;


Задача такова

В fin_relations для каждого пользователя в поле prava записаны элементы(id) через запятую, к которым он имеет доступ.

Тоесть фактически нужно

из таблицы fin_bank_name выбрать строки с такими id, которые есть в поле prava(перечисленные через запятую) для конкретного пользователя.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 20-57    Заголовок сообщения: Ответить с цитатой

Ну и отлично

CREATE TABLE `fin_relations` (
`id_pole` int(11) NOT NULL auto_increment,
`id` int(11) NOT NULL default '0',
`parentid` int(11) NOT NULL default '0',
`comment` text NOT NULL,
PRIMARY KEY (`id_pole`),
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT ;

REATE TABLE `prava` (
id int(11) auto_increment,
id_prava int(11) not null,
id_fin_relateons int(11) not null)
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Чт 24-04-08 : 20-59    Заголовок сообщения: Ответить с цитатой

BS
А запрос к двум таблицам тогда как будет выглядеть, не подскажешь ?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 20-59    Заголовок сообщения: Ответить с цитатой

Richard Ferlow

Что именно тебе не понятно?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 21-00    Заголовок сообщения: Ответить с цитатой

Точнее, что ты хочешь сделать?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Чт 24-04-08 : 21-06    Заголовок сообщения: Ответить с цитатой

BS
Из таблицы `fin_bank_name`

Сделать выборку согласно правам в новой таблице `prava`

Т.е из fin_bank_name сделать SELECT *, где id записей есть в id_prava у пользователя userid в таблице

СREATE TABLE `prava` (
id int(11) auto_increment,
id_prava int(11) not null,
userid int(11) not null)

В запросах к нескольким таблицам не силен просто.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 21-07    Заголовок сообщения: Ответить с цитатой

Если ты хочешь выбрать права, то, это, типа

select * prava, fin_relations where fin_relations.id=prava.id_prava

Кстати говоря, в теории реляционных баз данных есть такое определение, как нормальная форма. Всего их пять. Хорошо, когда база данных находится хотя бы в третьей. Ты решил игнорировать первую. "значением таблицы не может быть таблица или массив" Smile
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 21-10    Заголовок сообщения: Ответить с цитатой

Не понял, какое ты условие должно быть. Представь, что ты объясняешь очень тупому человеку) Вроде меня)
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Чт 24-04-08 : 21-11    Заголовок сообщения: Ответить с цитатой

BS
С запросом поэкперементирую Smile


Ты имеешь ввиду, что неверно нужные мне значения через запятую так хранить в поле ?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 21-13    Заголовок сообщения: Ответить с цитатой

Ну да)
Попробуй, действительно, что нибудь сам сделать. Если не получиться, пиши, разберёмся Smile
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Чт 24-04-08 : 21-21    Заголовок сообщения: Ответить с цитатой

BS
Почему же, смотри.

У каждого пользователя есть такое вот текстовое поле, где хранятся id, к которым он имеет доступ.

Далее в системе определяется для пользователя, когда он авторизован, массив из этих элементов($permission).

Для какого-то места проверяется, если в массиве прав доступа ($permission) содержится допустим число 22, то к этому блоку человек имеет доступ.

Код:

   $prava = $DB->query_first("SELECT prava FROM " . TABLE_PREFIX . "relations WHERE id = '$userids' AND parentid = '$parentadmin' ");

   $permisson    = @explode(',', $prava['prava']);


Дальше проверяем есть ли доступ
Код:

if(@in_array(22, $permisson))


Но в случае взаимодействия этих прав с другими таблицами вот вышла неурядица Smile
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Пт 25-04-08 : 11-01    Заголовок сообщения: Ответить с цитатой

Richard Ferlow
Ты хочешь быть как в том анегдоте, где гинеколог чинил автомобиль через трубу?

Ну это будет работать, я не спрорю. А ссли тебе понадобиться убрать права или добавить?
Тоже самое могло иметь следующий вид

select count(*) from, fin_relations, prava where fin_relations.id=prava.id_prava and prava.id_prava = 22

И смотришь, 0 или не ноль и сё.

Я не совсем понимаю логику твоей бд, поэтому не могу добавить вторую таблицу, наверно это будет что то вроде

select count(*) from, fin_relations, prava, fin_bank_name where fin_relations.id=prava.id_prava and prava.id_prava = 22 and fin_bank_name. user_id = fin_relations.id
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Пт 25-04-08 : 11-47    Заголовок сообщения: Ответить с цитатой

BS
Так я один раз делаю запрос к базе и все.

Добавление и убирание прав делается через массив из checkbox - из тех, что отмечены, из массива значений через implode получаем строчку через запятую и помещаем в базу данных.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Пт 25-04-08 : 16-25    Заголовок сообщения: Ответить с цитатой

В любом случае нормальный способ будет работать быстрее, когда будет меньше и он будет читабельнее.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Вт 29-04-08 : 01-13    Заголовок сообщения: Ответить с цитатой

BS
Smile

Кстати, на форуме одном мне предложили вот какой вариант
Код:

$id_list ="1,3,5,7,9";

$q = mysql_query("select * from table where id in($id_list)")


По ходу как раз что нужно =), но еще не пробовал =)
А я блин уже намутил отдельную таблицу под права =)

Smile)
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Вт 29-04-08 : 11-15    Заголовок сообщения: Ответить с цитатой

Richard Ferlow
Структура таблиц - бред.
Используй 3ую таблицу.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
Показать сообщения:   
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ Часовой пояс: GMT + 7
На страницу 1 2
Страница 2 из 2

 

 
Аватары: Вкл|Выкл   ЮзерИнфо: Вкл|Выкл   Подписи: Вкл|Выкл
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы