2017-04-03 144 views
1

我的查詢出了什麼問題?我確信它的工作在幾天前,但今天我不知道它爲什麼會發生。我怎麼能解決這個問題? 對不起我的英文不好pg_query():查詢失敗:錯誤:由用作表達式的子查詢返回的多於一行

錯誤: enter image description here

查詢:

function getUserGroupList() { 
    $rulesQuery = "SELECT * FROM t_rules"; 
    $rulesResult = pg_query($this->DB, $rulesQuery); 

    $nextQuery = ''; 

    while ($data = pg_fetch_array($rulesResult)) { 
     $nextQuery .= ",(SELECT COUNT(*) FROM t_user_group_rules ugp WHERE ugp.ref_user_group = ug.id AND ugp.ref_rules = ".$data['id'].") as ".str_replace(' ', '_', $data['c_name'])."_count,(SELECT c_status FROM t_user_group_rules ugp WHERE ugp.ref_user_group = ug.id AND ugp.ref_rules = ".$data['id'].") as ".str_replace(' ', '_', $data['c_name']); 
    } 

    $query = "SELECT ug.id, ug.c_name $nextQuery 
     FROM t_user_group ug 
     WHERE ug.c_active = 1"; 

    $result = pg_query($this->DB, $query); 
    // echo $query; 
    // exit(); 
    $all = array(); 

    while ($data = pg_fetch_assoc($result)) { 
     array_push($all, $data); 
    } 

    echo json_encode($all); 
} 

如果我贊同$query,它會變成這個樣子

SELECT 
    ug.id, 
    ug.c_name, 
    (SELECT count(*) 
    FROM t_user_group_rules ugp 
    WHERE ugp.ref_user_group = ug.id 
     AND ugp.ref_rules = 1 
    ) AS command_count, 
    (SELECT c_status 
    FROM t_user_group_rules ugp 
    WHERE ugp.ref_user_group = ug.id 
     AND ugp.ref_rules = 1 
    ) AS command, 
    (SELECT count(*) 
    FROM t_user_group_rules ugp 
    WHERE ugp.ref_user_group = ug.id 
     AND ugp.ref_rules = 2 
    ) AS user_count, 
    (SELECT c_status 
    FROM t_user_group_rules ugp 
    WHERE ugp.ref_user_group = ug.id 
     AND ugp.ref_rules = 2 
    ) AS USER, 
    (SELECT count(*) 
    FROM t_user_group_rules ugp 
    WHERE ugp.ref_user_group = ug.id 
     AND ugp.ref_rules = 3 
    ) AS executive_count, 
    (SELECT c_status 
    FROM t_user_group_rules ugp 
    WHERE ugp.ref_user_group = ug.id 
     AND ugp.ref_rules = 3 
    ) AS executive, 
    (SELECT count(*) 
    FROM t_user_group_rules ugp 
    WHERE ugp.ref_user_group = ug.id 
     AND ugp.ref_rules = 4 
    ) AS rekon_count, 
    (SELECT c_status 
    FROM t_user_group_rules ugp 
    WHERE ugp.ref_user_group = ug.id 
     AND ugp.ref_rules = 4 
    ) AS rekon, 
    (SELECT count(*) 
    FROM t_user_group_rules ugp 
    WHERE ugp.ref_user_group = ug.id 
     AND ugp.ref_rules = 5 
    ) AS ej_count, 
    (SELECT c_status 
    FROM t_user_group_rules ugp 
    WHERE ugp.ref_user_group = ug.id 
     AND ugp.ref_rules = 5 
    ) AS ej, 
    (SELECT count(*) 
    FROM t_user_group_rules ugp 
    WHERE ugp.ref_user_group = ug.id 
     AND ugp.ref_rules = 12 
    ) AS tes_count, 
    (SELECT c_status 
    FROM t_user_group_rules ugp 
    WHERE ugp.ref_user_group = ug.id 
     AND ugp.ref_rules = 12 
    ) AS tes 
FROM t_user_group ug 
WHERE ug.c_active = 1; 
+1

您應該在PHP中爲您的查詢使用預準備語句。您當前的查詢非常難以閱讀,因爲它被很多連接混淆。 –

+0

它也是不安全的。 https://en.wikipedia.org/wiki/SQL_injection –

+0

@TimBiegeleisen我該怎麼做?我很困惑。 –

回答

0

如果任何在count(*)的你查詢會返回一個大於1的值,你會得到這個錯誤。

這是因爲SELECT列表中的子查詢可能不會返回多個值,因爲它會導致一個值(如果沒有結果,您將得到一個SQL NULL)。

+0

哦,好的,我明白了。謝謝先生。我試圖按照盧卡斯的回答和工作 –

相關問題