【问题标题】:pg_query(): Query failed: ERROR: more than one row returned by a subquery used as an expressionpg_query():查询失败:错误:用作表达式的子查询返回多行
【发布时间】:2017-08-27 20:16:57
【问题描述】:

我的查询有什么问题?几天前我确定它的工作,但今天我不知道它为什么会发生。我怎么能解决这个问题? 对不起我的英语不好

错误:

查询:

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;

【问题讨论】:

  • 您应该在 PHP 中为您的查询使用准备好的语句。您当前的查询很难阅读,因为它被很多串联混淆了。
  • 它也非常不安全。 en.wikipedia.org/wiki/SQL_injection
  • @TimBiegeleisen 我该怎么做?我很困惑。
  • @CraigRinger 是的,我会尽快保证安全
  • 您遇到了一个 PHP 问题和一个 SQL 问题。如果您想解决 SQL 问题,这就是您的标题所暗示的,请编辑您的问题并向我们展示正在运行的原始 Postgres 查询。

标签: php sql json postgresql


【解决方案1】:

如果您查询中的任何count(*) 将返回大于 1 的值,您将收到此错误。

这是因为SELECT 列表中的子选择可能不会返回多个单个值,因为它会产生单个值(如果没有结果,您将获得 SQL NULL)。

【讨论】:

  • 哦,好吧,我明白了。谢谢先生。我尝试关注@Lukasz 的回答及其工作
猜你喜欢
  • 2018-02-13
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多