我想将子查询的结果包含到我的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行
答案 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 = ?';