チケットを保存するテーブル、部門を保存するテーブル、ユーザーを保存するテーブルの 1 つで、さまざまなテーブルを持つシステムがあります。
最初の 2 つのテーブルは、その他の静的情報 (基本的には ID) のみを保持しますが、チケットのリストを取得するときに、部門とオペレーターの名前も収集する必要があるため、この時点で別のクエリを実行して、部門の名前を取得し、$_SESSION 内に保存し、ループした後:
部門の名前を取得します。
function retrive_depa_names($Hostname, $Username, $Password, $DatabaseName, $SupportDepaTable){
if(isset($_SESSION['status']) && $_SESSION['status']<3){
$mysqli = new mysqli($Hostname, $Username, $Password, $DatabaseName);
$stmt = $mysqli->stmt_init();
if($stmt){
$query = "SELECT `id`,`department_name` FROM ".$SupportDepaTable;
$prepared = $stmt->prepare($query);
if($prepared){
if($stmt->execute()){
$stmt->store_result();
$result = $stmt->bind_result($camaro, $mustang);
if($stmt->num_rows>0){
$_SESSION['departments']=array();
while (mysqli_stmt_fetch($stmt))
$_SESSION['departments'][$camaro]=$mustang;
}
}
}
}
$mysqli->close();
}
}
部門の名前を抽出します。
while (mysqli_stmt_fetch($stmt)) {
/*Departments Name*/
if(isset($_SESSION['departments'][$depid]))
$depname=$_SESSION['departments'][$depid];
else{
retrive_depa_names($Hostname, $Username, $Password, $DatabaseName, $SupportDepaTable);
if(isset($_SESSION['departments'][$depid]))
$depname=$_SESSION['departments'][$depid];
else
$depname='Unknown';
}
[..]
}
同じことがオペレーターにも起こります。
この方法で良いのか、JOINを使ってクエリ(チケット一覧を取得するもの)に全て任せた方が良いのか、私が使っている方法だと最初は負荷が重いが、その後は楽になるはずなので、問題は、他のユーザーが行うことができる変更を追跡しないことです。
基本的に、サーバー リソースの大量使用を回避できる方法を知りたいです。
ありがとう
編集
これらはテーブルです:
CREATE TABLE IF NOT EXISTS `razorphyn_support_list_tickets` (
`id` BIGINT(15) UNSIGNED NOT NULL AUTO_INCREMENT,
`enc_id` CHAR(87),
`ref_id` VARCHAR(18),
`department_id` BIGINT(11) UNSIGNED NOT NULL,
`operator_id` BIGINT(11) UNSIGNED NOT NULL DEFAULT 0,
`user_id` BIGINT(11) UNSIGNED NOT NULL,
`title` VARCHAR(255) NOT NULL,
`priority` INT(2) UNSIGNED NOT NULL,
`website` VARCHAR(200) NOT NULL,
`contype` ENUM('0','1','2','3','4','5') NOT NULL DEFAULT '0',
`ftp_user` VARCHAR(60) NOT NULL,
`ftp_password` VARCHAR(60) NOT NULL,
`created_time` DATETIME NOT NULL,
`last_reply` DATETIME NOT NULL,
`ticket_status` ENUM('0','1','2','3') NOT NULL DEFAULT '2',
`operator_rate` DECIMAL(4,2) UNSIGNED,
PRIMARY KEY (`id`),
UNIQUE KEY (`user_id`,`title`),
INDEX (`enc_id`,`department_id`,`operator_id`,`user_id`,`ticket_status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20;
CREATE TABLE IF NOT EXISTS `razorphyn_support_departments` (
`id` BIGINT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`department_name` VARCHAR(70) NOT NULL,
`active` ENUM('0','1') NOT NULL DEFAULT '1',
`public_view` ENUM('0','1') NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY (`department_name`),
INDEX (`id`,`department_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;
CREATE TABLE IF NOT EXISTS `razorphyn_support_users` (
`id` BIGINT(15) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`mail` VARCHAR(50) NOT NULL,
`password` VARCHAR(200) NOT NULL,
`reg_key` VARCHAR(260) ,
`tmp_password` VARCHAR(87) ,
`ip_address` VARCHAR(50) NOT NULL,
`status` ENUM('0','1','2','3','4') NOT NULL DEFAULT '3',
`holiday` ENUM('0','1') NOT NULL DEFAULT '0',
`mail_alert` ENUM('no','yes') NOT NULL DEFAULT 'yes',
`assigned_tickets` INT(5) UNSIGNED NOT NULL DEFAULT 0,
`solved_tickets` BIGINT(11) UNSIGNED NOT NULL DEFAULT 0,
`number_rating` BIGINT(6) UNSIGNED NOT NULL DEFAULT 0,
`rating` DECIMAL(4,2) UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY(`mail`),
INDEX (`name`,`mail`,`status`,`holiday`,`assigned_tickets`,`solved_tickets`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=55;
追加情報
これは、チケット リストを取得するためのメイン クエリです。
$query = "SELECT `user_id`,`enc_id`,`department_id`,`operator_id`,`title`,CASE priority WHEN '0' THEN 'Low' WHEN '1' THEN 'Medium' WHEN '2' THEN 'High' WHEN '3' THEN 'Urgent' WHEN '4' THEN 'Critical' ELSE priority END,`created_time`,`last_reply`,CASE `ticket_status` WHEN '0' THEN '<span class=\'label label-success\'>Closed</span>' WHEN '1' THEN '<span class=\'label label-important\'>Open</span>' WHEN '2' THEN '<span class=\'label label-warning\'>To Assign</span>' WHEN '3' THEN '<span class=\'label label-important\'>Reported</span>' ELSE 'Error' END FROM ".$SupportTicketsTable." ORDER BY `last_reply` DESC LIMIT 350";
ここでdepartment_id
、id
は部門テーブルの でuser_id
ありoperator_id
、id
はユーザー テーブルの です(operator_id
とstatus
等しい1
または2