| imho.ws |
![]() |
|
|
|
# 1 |
|
Full Member
Регистрация: 05.02.2002
Адрес: Underground
Сообщения: 2 110
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
MYSQL GROUP BY
Мне нужно то, что спрашивается здесь:
http://www.sql.ru/forum/actualthread...&tid=66341&hl= Действительно до версии 4.1 этого не реализовать? А когда версия 4.1 выйдет? Последний раз редактировалось Neo; 19.09.2004 в 03:01. |
|
|
|
|
# 3 |
|
Full Member
Регистрация: 29.05.2002
Сообщения: 544
![]() ![]() ![]() ![]() ![]() |
вообще если провести нормализацию 4уровня, то эта проблема должна отпасть.
т.е. будет что-то вроде: userTable(uid, uname) 1 vasya 2 grisha posTable(pid, ptitle) 1 pos1 2 pos2 3 pos3 user_posTable(uid, pid) <-- псевдо foreign keys(т.к. в мускуле со внешними ключами тоже через одно место, особнно в версии 3.23.x). 1 1 2 1 1 2 select uid from user_posTable where pid = 'pos1' если надо подцепить данные со связных таблиц, то замечательно через join.
__________________
убрано по просьбе администратора
|
|
|
|
|
# 6 |
|
Full Member
Регистрация: 29.05.2002
Сообщения: 544
![]() ![]() ![]() ![]() ![]() |
а чего подробнее? в 3.23.x для этого нужно заводить таблицы, типа innoDB, а это:
1. намного менее производительное решение, особенно на больших таблицах. 2. иногда просто невозможно использовать их из-за хостинга. и по-моему(но это я точно уже не вспомню), что-то из actions при delete|update не поддерживается в 3.23.x, хотя вот тут не ручаюсь. p.s. большая таблица, это скажем несколько миллионов записей и несколько сотен мегабайт. попробуй запустить агрегат на такой таблице...
__________________
убрано по просьбе администратора
|
|
|
|
|
# 8 |
|
Full Member
Регистрация: 29.05.2002
Сообщения: 544
![]() ![]() ![]() ![]() ![]() |
я ж написал, использовать псевдо-ключи, т.е. взять обработку ключей на себя(прямо в программе).
допустим у нас есть pk - x_id(auto_increment) во всех остальных таблицах это будет обычное поле x_id, только обрабатывать constrants нужно будет в ручную, т.е. все update|delete и ограничения(запрет дублирования например) нужно будет реализовать в скрипте. я уже давно так делаю...
__________________
убрано по просьбе администратора
|
|
|
|
|
# 10 |
|
Full Member
Регистрация: 29.05.2002
Сообщения: 544
![]() ![]() ![]() ![]() ![]() |
ну в принципе каждый выбирает сам. вот пример из сегодняшнего буквально дня:
есть таблицы: Код:
# # Структура таблицы `actions` # CREATE TABLE actions ( act_ID int(11) NOT NULL auto_increment, act_TITLE varchar(30) NOT NULL default '', act_DESC varchar(255) default NULL, act_ACTIVE int(11) NOT NULL default '1', PRIMARY KEY (act_ID) ) TYPE=MyISAM PACK_KEYS=0; # -------------------------------------------------------- # # Структура таблицы `areas` # CREATE TABLE areas ( ar_ID int(11) NOT NULL auto_increment, ar_PATH text NOT NULL, ar_DESC varchar(255) default NULL, PRIMARY KEY (ar_ID) ) TYPE=MyISAM; # -------------------------------------------------------- # # Структура таблицы `areas_actions` # CREATE TABLE areas_actions ( aa_ID int(11) NOT NULL default '0', ar_ID int(11) NOT NULL default '0', act_ID int(11) NOT NULL default '0', PRIMARY KEY (aa_ID) ) TYPE=MyISAM; # -------------------------------------------------------- # # Структура таблицы `permissions` # CREATE TABLE permissions ( p_ID int(11) NOT NULL auto_increment, usr_ID int(11) NOT NULL default '0', aa_ID int(11) NOT NULL default '0', PRIMARY KEY (p_ID) ) TYPE=MyISAM; # -------------------------------------------------------- # # Структура таблицы `users` # CREATE TABLE users ( usr_ID int(11) NOT NULL auto_increment, usr_LOGIN varchar(20) NOT NULL default '', usr_PASS varchar(20) NOT NULL default '', PRIMARY KEY (usr_ID) ) TYPE=MyISAM; как нетрудно догадаться - это обычная авторизация(груп пока нету). вот тут было бы идеально использовать FK, но к сожалению на хостинге я не могу создавать таблицы InnoDB. получается настоящий гемор. приведу пример обновления настроек доступа для пользователя: Код:
class Permission
{
.....
function DeleteUserPermissions()
{
if (isset($this->userId) && !empty($this->userId))
{
$db = new MySql(null,"bd",null,null);
$db->MySql_Connect();
$db->MySql_SelectDb();
$selectQuery = "select p.p_ID
from permissions as p
inner join areas_actions as aa
on p.aa_ID = aa.aa_ID
inner join actions as act
on aa.act_ID = act.act_ID
inner join areas as ar
on aa.ar_ID = ar.ar_ID
where usr_ID=" . $this->userId;
//echo $selectQuery;
$db->MySql_QueryDb($selectQuery);
if ($db->dbResult != null)
{
while($row = mysql_fetch_assoc($db->dbResult))
{
if ($this->DeletePermissionById($row['p_ID']) !== 0)
{
return -1;
}
}
return 0;
}
}
return 0;
}
function UpdateUserPermissions($areaPath, $actionId)
{
if (isset($this->userId) && !empty($this->userId))
{
$db = new MySql(null,"bd",null,null);
$db->MySql_Connect();
$db->MySql_SelectDb();
$insertQuery = "insert into Permissions
(usr_ID, aa_ID)
SELECT usr.usr_ID, aa.aa_ID
FROM areas_actions as aa, users as usr
inner join areas as ar
on ar.ar_ID = aa.ar_ID
inner join actions as act
on aa.act_ID = act.act_ID
where ar.ar_PATH = '" . $areaPath . "'
and act.act_ID = " . $actionId . "
and usr.usr_ID = " . $this->userId;
$db->MySql_QueryDb($insertQuery);
if (mysql_affected_rows() > 0)
{
return 0;
}
}
return -1;
}
function DeletePermissionById($permId)
{
$db = new MySql(null,"bd",null,null);
$db->MySql_Connect();
$db->MySql_SelectDb();
$deleteQuery = "delete from permissions where p_ID = "
. $permId
. " limit 1";
$db->MySql_QueryDb($deleteQuery);
if (mysql_affected_rows() > 0)
{
return 0;
}
return -1;
}
function Update($userPermissionInfo)
{
if ($this->DeleteUserPermissions() !== 0)
{
return -1;
}
foreach($userPermissionInfo as $area=>$actions)
{
foreach($actions as $actionId)
{
if ($this->UpdateUserPermissions($area, $actionId) !== 0)
{
return -1;
}
}
}
return 0;
}
.......
}
если бы было каскадное удаление, то достаточно было бы дернуть мастер-таблицу и все. также нету транзакций.
__________________
убрано по просьбе администратора
|
|
|
|
|
# 11 |
|
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Вообще-то я тоже все ключи обрабатываю сам (если это кому-то интересно
), хотя конечнобыло бы приятнее возложить это на БД....
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
|
|