Тема: MYSQL GROUP BY
Показать сообщение отдельно
Старый 21.09.2004, 12:36     # 10
Sheryld
Full Member
 
Регистрация: 29.05.2002
Сообщения: 544

Sheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царстве
ну в принципе каждый выбирает сам. вот пример из сегодняшнего буквально дня:

есть таблицы:

Код:
#
# Структура таблицы `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;
	}

 .......

}
схема такая: сначала удаляются все настройки пользователя, а затем обновляются(на основе данных формы).

если бы было каскадное удаление, то достаточно было бы дернуть мастер-таблицу и все.

также нету транзакций.
__________________
убрано по просьбе администратора
Sheryld вне форума