如何将子查询的所有结果包含到SELECT语句中?

时间:2017-09-22 06:36:56

标签: php mysql sql

我想将子查询的结果包含到我的SELECT语句中但我仍然坚持如何使用我的SQL语句执行此操作。当子查询返回一个结果时,我的语句似乎工作正常,但是当它返回多行时,它就成了一个问题。下面是我的SQL语句的结构:

function get_client ($client_ec_no){
    include 'connection.php';

    $sql = 'SELECT cs.*, 
            (SELECT ss.s_name 
                    FROM ss, mcs 
                    WHERE mcs.mcs_s_id = ss.s_id 
                    AND mcs.mcs_client_ec_no = ?)

    FROM cs, ss, mcs
    WHERE cs.client_ec_no = ?';

    try {
        $results = $db->prepare($sql);
        $results->bindValue(1, $client_ec_no, PDO::PARAM_STR);
        $results->bindValue(2, $client_ec_no, PDO::PARAM_STR);
        $results->execute();
    } catch (Exception $e) {
        echo "Error!: " . $e->getMessage() . "<br />";
        return false;
    }
    return $results->fetch();
}

我收到错误:

  

错误!:SQLSTATE [21000]:基数违规:1242子查询返回   超过1行

5 个答案:

答案 0 :(得分:1)

你可以JOIN,而不是在SELECT

中使用它
SELECT cs.*, t.*
  FROM cs, ss, mcs
INNER JOIN
(
    SELECT ss.s_name, ss.s_id
    FROM ss, mcs 
    WHERE mcs.mcs_s_id = ss.s_id 
      AND mcs.mcs_client_ec_no = ?
) AS t ON ss.s_id = t.s_id AND mcs.mcs_s_id = t.mcs_s_id
  WHERE cs.client_ec_no = ?

请注意,表格FROM cs, ss, mcs将为CROSS JOIN,因为您没有提供加入条件。您应该添加连接条件,我建议使用以下语法:

SELECT cs.*, t.*
FROM cs
INNER JOIN ss  ON ...
INNER JOIN mcs ON ...
INNER JOIN
(
    SELECT ss.s_name, ss.s_id
    FROM ss, mcs 
    WHERE mcs.mcs_s_id = ss.s_id 
      AND mcs.mcs_client_ec_no = ?
) AS t ON ss.s_id = t.s_id AND mcs.mcs_s_id = t.mcs_s_id
  WHERE cs.client_ec_no = ?

答案 1 :(得分:0)

您可以使用“加入”来解决此错误。以下查询可能适用于您。

  SELECT cs.*, ss.s_name  FROM ss JOIN mcs ON ss.s_id =  mcs.mcs_s_id  JOIN cs ON cs.client_ec_no = mcs.mcs_client_ec_no WHERE  cs.client_ec_no =? 

答案 2 :(得分:0)

我理解你的查询, 您需要来自ss表的cs表,s_name中的所有内容。 并且s_id在mcs和ss中很常见。提供了client_ec_no,它存在于mcs和cs中。现在所有三个表都加入了。 我重新构建了您的查询并添加了一个独特的,以便没有重复。并且还会有交叉连接,因为您没有在外部查询中指定任何连接条件。

count()

答案 3 :(得分:0)

我不确定你的查询是做什么的,但是如果子查询中只有一个结果是好的,那么这将消除错误:

$sql = 'SELECT cs.*, 
        (SELECT TOP 1 ss.s_name 
         FROM ss LEFT JOIN mcs ON 
             ss.s_id = mcs.mcs_s_id 
         WHERE
             mcs.mcs_client_ec_no = ?
        )
        FROM cs
        WHERE cs.client_ec_no = ?';

答案 4 :(得分:0)

使用别名并加入。 Coreect语法:

 $sql = 'SELECT cs.*, 
        (SELECT ss.s_name 
                FROM ss INNER JOIN mcs ON mcs.mcs_s_id = ss.s_id 
                WHERE 
                mcs.mcs_client_ec_no = ? LIMIT 1) AS some_value

FROM cs
WHERE cs.client_ec_no = ?';