IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   MYSQL GROUP BY (https://www.imho.ws/showthread.php?t=68802)

Psionic Vision 19.09.2004 00:40

MYSQL GROUP BY
 
Мне нужно то, что спрашивается здесь:
http://www.sql.ru/forum/actualthread...&tid=66341&hl=

Действительно до версии 4.1 этого не реализовать?

А когда версия 4.1 выйдет?

RaZEr 19.09.2004 04:58

Цитата:

А когда версия 4.1 выйдет?
5-ая уже давно вышла (правда пока не релиз)...

Sheryld 19.09.2004 13:41

вообще если провести нормализацию 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.

RaZEr 19.09.2004 16:10

Цитата:

т.к. в мускуле со внешними ключами тоже через одно место
Здесь подробнее...

Psionic Vision 19.09.2004 17:02

RaZEr
Но хостеры версию 4.1 так и не поставили, говорят она в альфа стадии..

Sheryld 20.09.2004 00:33

а чего подробнее? в 3.23.x для этого нужно заводить таблицы, типа innoDB, а это:

1. намного менее производительное решение, особенно на больших таблицах.
2. иногда просто невозможно использовать их из-за хостинга.

и по-моему(но это я точно уже не вспомню), что-то из actions при delete|update не поддерживается в 3.23.x, хотя вот тут не ручаюсь.

p.s. большая таблица, это скажем несколько миллионов записей и несколько сотен мегабайт. попробуй запустить агрегат на такой таблице...

RaZEr 20.09.2004 08:16

Цитата:

1. намного менее производительное решение, особенно на больших таблицах.
2. иногда просто невозможно использовать их из-за хостинга.
И что ты предлагаешь?

Sheryld 20.09.2004 09:59

я ж написал, использовать псевдо-ключи, т.е. взять обработку ключей на себя(прямо в программе).

допустим у нас есть pk - x_id(auto_increment)

во всех остальных таблицах это будет обычное поле x_id, только обрабатывать constrants нужно будет в ручную, т.е. все update|delete и ограничения(запрет дублирования например) нужно будет реализовать в скрипте.

я уже давно так делаю...

RaZEr 20.09.2004 18:22

Цитата:

я ж написал, использовать псевдо-ключи, т.е. взять обработку ключей на себя(прямо в программе).
И ты уверен что этот геморой в итоге окажется лучше foreign keys?

Sheryld 21.09.2004 12:36

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

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

Код:

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

 .......

}

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

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

также нету транзакций.

Hubbitus 21.09.2004 17:41

Вообще-то я тоже все ключи обрабатываю сам (если это кому-то интересно :) ), хотя конечнобыло бы приятнее возложить это на БД....


Часовой пояс GMT +4, время: 19:25.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.