Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将子查询的所有结果包含到SELECT语句中?_Php_Mysql_Sql - Fatal编程技术网

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

Php 如何将子查询的所有结果包含到SELECT语句中?,php,mysql,sql,Php,Mysql,Sql,我想在SELECT语句中包含子查询的结果,但我一直在想如何使用SQL语句来实现这一点。当子查询返回一个结果时,我的语句似乎工作正常,但当它返回多个行时,就成了问题。下面是我的SQL语句的结构: function get_client ($client_ec_no){ include 'connection.php'; $sql = 'SELECT cs.*, (SELECT ss.s_name FROM ss,

我想在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();
}
我得到一个错误:

$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 = ?';
错误!:SQLSTATE[21000]:基数冲突:1242子查询返回 超过1行

您可以加入它,而不是在选择中使用它:

注意,来自cs、ss、mcs的表将是交叉连接的,因为您没有提供连接条件。您应该添加连接条件,我建议使用以下语法:

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

您可以使用联接来解决此错误

  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表中的所有内容,ss表中的s_名称。 s_id在mcs和ss中很常见。提供mcs和cs中存在的客户号。现在所有三个表都连接起来了。 我重新构造了您的查询,并在其中添加了一个distinct,这样就不会有重复的查询。此外,还会出现交叉联接,因为您没有在外部查询中指定任何联接条件

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

使用别名和联接。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 = ?';

$client\u cs\u no的内容是什么?错误消息说明了一切。你想要什么?改为左连接。顺便说一句,您的查询似乎缺少一些连接条件。外部查询中cs、ss、mcs的连接条件在哪里?这里有一个笛卡尔积@OptimusCrime这是一个单词stringSee@草莓-是的,我知道这是另一种方式,但是三个表cs、ss、mcs的连接条件在哪里?我只能看到其中cs.client_ec_no=?它将仅对此列进行筛选,但仍然是交叉联接。