Php 如何将子查询的所有结果包含到SELECT语句中?
我想在SELECT语句中包含子查询的结果,但我一直在想如何使用SQL语句来实现这一点。当子查询返回一个结果时,我的语句似乎工作正常,但当它返回多个行时,就成了问题。下面是我的SQL语句的结构: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,
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=?它将仅对此列进行筛选,但仍然是交叉联接。