簡體   English   中英

使用JOIN從數據庫中檢索結果

[英]Retrieve results from database with JOIN

我試圖將函數的操作次數減少到只有一個查詢,但現在我無法檢索任何結果:

function retrive_avaible_operator($Hostname, $Username, $Password, $DatabaseName, $SupportUserPerDepaTable, $SupportUserTable,$dep){
    $query = "SELECT b.id  
              FROM ".$SupportUserTable." b
              INNER JOIN ".$SupportUserPerDepaTable." a
                  ON b.id=a.user_id
              WHERE a.department_id=? AND b.holiday='0' AND a.user_id!=".$_SESSION['id']." 
              ORDER BY b.assigned_tickets ASC LIMIT 1";

    $mysqli = new mysqli($Hostname, $Username, $Password, $DatabaseName);
    $stmt = $mysqli->stmt_init();
    $prepared = $stmt->prepare($query);

    if($prepared){
        if($stmt->bind_param('i', $dep)){
            if($stmt->execute()){
                $stmt->store_result();
                $result = $stmt->bind_result($camaro);
                if($stmt->num_rows>0){
                    while (mysqli_stmt_fetch($stmt))
                        $selopid=$camaro;
                    return $selopid;
                }
                else
                    return 'No Operator Available';
            }
            else
                return mysqli_stmt_error($stmt);
        }
        else
            return mysqli_stmt_error($stmt);
    }
    else
        return mysqli_stmt_error($stmt);
}

在此之前嘗試操作(這是兩個不同的查詢):

  1. $SupportUserPerDepaTable中選擇所有id,其中a.department_id=?
  2. $SupportUserTable中選擇所有id,其中id在前面的結果中, holiday='0'

它工作,但現在它只返回No Operator Available

這些是表格:

CREATE TABLE IF NOT EXISTS `razorphyn_support_user_departments` (
`id`                BIGINT(11)  UNSIGNED    NOT NULL    AUTO_INCREMENT,
`department_id`     BIGINT(11)  UNSIGNED    NOT NULL,
`department_name`   VARCHAR(70)             NOT NULL,
`user_id`           BIGINT(11)  UNSIGNED    NOT NULL,
`holiday`           ENUM('0','1')           NOT NULL    DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY(`department_name`,`user_id`),
INDEX(`department_id`,`department_name`,`user_id`)
) 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;

編輯
我發現(不幸的是,因為非常丑陋而且凌亂)以前的代碼(我刪除了所有控件,但是它有效):

function retrive_avaible_operator($Hostname, $Username, $Password, $DatabaseName, $SupportUserPerDepaTable, $SupportUserTable,$dep){

$query = "SELECT `user_id`  FROM ".$SupportUserPerDepaTable." WHERE `department_id`=? AND `user_id`!=".$_SESSION['id'] ;
$mysqli = new mysqli($Hostname, $Username, $Password, $DatabaseName);
$stmt = $mysqli->stmt_init();
$prepared = $stmt->prepare($query);
    $stmt->bind_param('i', $dep)
        $stmt->execute()
            $stmt->store_result();
            $operator=array();
            $result = $stmt->bind_result($camaro);
            if($stmt->num_rows>0){
                while (mysqli_stmt_fetch($stmt))
                    $operator[]=$camaro;
                $operator=join(',',$operator);
                $query = "SELECT `id`  FROM ".$SupportUserTable." WHERE `id` IN (".$operator.") AND `holiday`='0' ORDER BY `assigned_tickets` ASC LIMIT 1" ;
                $prepared = $stmt->prepare($query);
                $prepared)
                    $stmt->execute()
                        $stmt->store_result();
                        $result = $stmt->bind_result($camaro);
                        if($stmt->num_rows>0){
                            while (mysqli_stmt_fetch($stmt))
                                $selopid=$camaro;
                            return $selopid;
                        }
                        else{
                            $query = "SELECT `id` FROM ".$SupportUserTable." WHERE `status`=2 AND `holiday`=0 AND `id`!=".$_SESSION['id']." ORDER BY `assigned_tickets` ASC, `solved_tickets` ASC LIMIT 1" ;
                            $prepared = $stmt->prepare($query);
                            $prepared
                                $stmt->execute()
                                    $stmt->store_result();
                                    $result = $stmt->bind_result($camaro);
                                    if($stmt->num_rows>0){
                                        while (mysqli_stmt_fetch($stmt))
                                            $selopid=$camaro;
                                        return $selopid;
                                    }
                                    else
                                        return 'No Operator Available';
                        }
            }
            else{
                $query = "SELECT `id` FROM ".$SupportUserTable." WHERE `status`='2' AND `holiday`='0' AND `id`!=".$_SESSION['id']." ORDER BY `assigned_tickets` ASC, `solved_tickets` ASC LIMIT 1" ;
                $prepared = $stmt->prepare($query);
                    $stmt->execute()
                        $stmt->store_result();
                        $result = $stmt->bind_result($camaro);
                        if($stmt->num_rows>0){
                            while (mysqli_stmt_fetch($stmt))
                                $selopid=$camaro;
                            return $selopid;
                        }
                        else
                            return 'No Operator Available';
            }
$mysqli->close();
}

你應該能夠大大縮小這一點。 在開始時,只查詢$SupportUserPerDepaTable以獲取user_id,只將它們加入到第二個查詢的逗號分隔字符串中。 您應該能夠通過將其轉換為子查詢來消除此問題。 第3和第4個查詢是多余的,是前一個if / else情況的產物,因此您可以將這些查詢組合起來,因為我們已經消除了top if條件。 使用底部的“丑陋”代碼,我將其濃縮為:

$mysqli = new mysqli($Hostname, $Username, $Password, $DatabaseName);
$stmt = $mysqli->stmt_init();
$query = "
SELECT      `id`  
FROM        ".$SupportUserTable." 
WHERE       `id` IN (
    SELECT      `user_id`  
    FROM        ".$SupportUserPerDepaTable." 
    WHERE       `department_id`= ? 
    AND         `user_id`!=".$_SESSION['id']."
)
AND         `holiday`='0'
ORDER BY    `assigned_tickets` ASC 
LIMIT       1" ;

$prepared = $stmt->prepare($query);
$stmt->bind_param('i', $dep);
$stmt->execute();
$stmt->store_result();
$operator=array();
$result = $stmt->bind_result($camaro);
if($stmt->num_rows>0){
    while (mysqli_stmt_fetch($stmt))
        $selopid=$camaro;
    return $selopid;
}
else{
    $query = "
    SELECT      `id` 
    FROM        ".$SupportUserTable." 
    WHERE       `status`= 2 
    AND         `holiday`=0 
    AND         `id`!=".$_SESSION['id']." 
    ORDER BY    `assigned_tickets` ASC
                ,`solved_tickets`  ASC 
    LIMIT       1" ;
    $prepared = $stmt->prepare($query);
    $stmt->execute();
    $stmt->store_result();
    $result = $stmt->bind_result($camaro);
    if($stmt->num_rows>0){
        while (mysqli_stmt_fetch($stmt))
            $selopid=$camaro;
        return $selopid;
    }
    else{
        return 'No Operator Available';
    }
}
$mysqli->close();

您可以通過使用組合限制為1的UNION將2個查詢進一步壓縮為1:

(
    SELECT      `id`  
    FROM        ".$SupportUserTable." 
    WHERE       `id` IN (
        SELECT      `user_id`  
        FROM        ".$SupportUserPerDepaTable." 
        WHERE       `department_id`= ? 
        AND         `user_id`!=".$_SESSION['id']."
    )
    AND         `holiday`='0'
    ORDER BY    `assigned_tickets` ASC 
    UNION
    SELECT      `id` 
        FROM        ".$SupportUserTable." 
        WHERE       `status`= 2 
        AND         `holiday`=0 
        AND         `id`!=".$_SESSION['id']." 
        ORDER BY    `assigned_tickets` ASC
                    ,`solved_tickets`  ASC 
)
LIMIT       1;

或者可能使用OR條件,具體取決於dept表中員工的狀態代碼,如:

SELECT      `id`  
FROM        ".$SupportUserTable." 
WHERE       `holiday`='0'
AND (       
        `id`    IN (
            SELECT      `user_id`  
            FROM        ".$SupportUserPerDepaTable." 
            WHERE       `department_id`= ? 
            AND         `user_id`!=".$_SESSION['id']."
        )
        AND     `status`= ('some code other than 2?') 
    )
    OR  (
                `status`= 2 
        AND     `id`! = ".$_SESSION['id']."
)
ORDER BY    status (asc or desc?)
            ,`assigned_tickets` ASC
            ,`solved_tickets`  ASC 
LIMIT       1;

我沒有對此進行測試,因為這需要花費太多時間來設置數據庫表,輸入樣本數據並全部測試,所以如果有任何小錯誤,請原諒我,但這應該指向正確的方向。 如果這不起作用,並且您想要將一些示例數據發布到http://sqlfiddle.com/並提供一些預期輸出的示例,我將重試一些查詢以查看我可以執行的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM