如何将子查询的所有结果包括在选择语句中



我想将子问题的结果包括在我的选择语句中,但我对如何使用我的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行

您可以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 = ?

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

  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 =? 

我理解您的查询,您需要CS表中的所有内容,S_NAME从SS表中。S_ID在MC和SS中很常见。client_ec_no提供了MCS和CS中存在的。现在,所有三张桌子都加入了。我重组了您的查询,并为此添加了一个不同的查询,因此没有重复。而且还将有交叉加入,因为您没有在外部查询中指定任何联接条件。

  'SELECT distinct cs.*, ss.s_name 
       FROM cs, ss, mcs
      WHERE mcs.mcs_s_id = ss.s_id 
        AND mcs.mcs_client_ec_no = ?
        AND cs.client_ec_no = ?'

我不确定您的查询要做什么,但是如果确切地将一个子问题导致了一个问题,那么这将摆脱错误:

$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 = ?';

使用别名并加入。核心语法:

 $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 = ?';

最新更新