Php 返回超过1行的子查询
嗨,我想做的是通过一个查询从一个表中获取一些客户的详细信息,以及他们在另一个表中的所有项目。我的子查询当前的问题是,它将返回超过1行并导致错误。有没有办法解决这个问题,或者我应该使用两个单独的查询 我想在查询中使用PDO fetchAll()返回它们的名字和姓氏以及包含所有项的子数组 因此,$result['First Name']、$result['First Name']、$result['product'][0]、$result['product'][1]、$result['product'][3]等都可以访问结果 当前报表:Php 返回超过1行的子查询,php,mysql,sql,select,Php,Mysql,Sql,Select,嗨,我想做的是通过一个查询从一个表中获取一些客户的详细信息,以及他们在另一个表中的所有项目。我的子查询当前的问题是,它将返回超过1行并导致错误。有没有办法解决这个问题,或者我应该使用两个单独的查询 我想在查询中使用PDO fetchAll()返回它们的名字和姓氏以及包含所有项的子数组 因此,$result['First Name']、$result['First Name']、$result['product'][0]、$result['product'][1]、$result['product
SELECT `First Name`, `Last Name`,
(SELECT `items`.`Product Name` from items
inner join customers on `customers`.`Customer No` = `items`.`Customer No`
WHERE `customers`.`Customer No` = '6')
AS product from customers where `Customer No` = '6'
试着加入他们
SELECT a.`First Name`,
a.`Last Name`,
b.`Product Name`
FROM customers a
INNER JOIN items b
ON a.`Customer No` = b.`Customer No`
WHERE a.`Customer No` = '6'
由于联接定义的类型:内部联接
,此查询将只返回在表项
上至少有一个匹配项的客户。但是,如果您仍然希望客户的记录显示/检索表项上是否有匹配值,请将内部联接更改为左侧联接(外部联接)
要了解有关加入的更多信息,请访问下面的文章
如果只想返回一行,可以添加限制1。但我认为这不是你想要的
如果要返回与客户关联的所有项目,可以使用左联接,如下所示:
SELECT c.`First Name`
, c.`Last Name`
, i.`Product Name` AS product
FROM customers c
LEFT
JOIN items i
ON i.`Customer No` = c.`Customer No`
WHERE c.`Customer No` = '6'
注意:LEFT JOIN
将返回来自客户的所有行,以及来自项目的任何匹配行。如果有客户在项目列表中没有任何行,product
列将为空。如果要排除没有任何项目的客户(如果不想返回一行),请删除LEFT
关键字。缺少LEFT
关键字相当于指定不必要的关键字INNER
)
要从customers表中返回一行以及一个相关项,那么在SELECT列表中使用子查询的方法是有效的
但是您不需要在该子查询中执行联接操作,您可以引用外部查询中的值(使其成为相关子查询)。不过,这里的关键是向子查询添加限制1,以确保它返回的行不超过1行
SELECT `First Name`
, `Last Name`
, ( SELECT `items`.`Product Name`
FROM `items`
WHERE `items`.`Customer No` = `customers`.`Customer No`
ORDER BY `items`.`Product Name`
LIMIT 1
) AS product
FROM customers
WHERE `Customer No` = '6'
ORDER BY不是必需的,但它使结果集具有确定性。也就是说,如果没有orderby,MySQL可以自由返回满足谓词的任何一行。后续运行可能会返回不同的结果。这没有什么错,但如果您不期望它,这可能会出乎意料。我认为不可能在一行内返回数组,但您可以使用group\u concat
将值连接到一个字符串中,然后在后面分解:
SELECT `customers`.`First Name`, `customers`.`Last Name`,
GROUP_CONCAT(`items`.`Product Name` SEPARATOR '$^$') AS `Products`
FROM customers
JOIN items
ON `customers`.`Customer No` = `items`.`Customer No`
WHERE `customers`.`Customer No` = 6
GROUP BY `Customer No`
$products=explode("$^$",$result[0]['products']);
group_concat
的默认分隔符是,
,使用explode时可能非常危险,因此我们使用分隔符“$^$”
添加一组不太可能出现的随机字符。将限制1添加到子查询中?@wcgallego是否确定左连接
(或外部连接)不使用索引?@wcgallego:您对这种行为有参考吗?因为MySQL实际上对带有外部联接的查询有效地使用了适当的索引。