Php 返回超过1行的子查询

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

嗨,我想做的是通过一个查询从一个表中获取一些客户的详细信息,以及他们在另一个表中的所有项目。我的子查询当前的问题是,它将返回超过1行并导致错误。有没有办法解决这个问题,或者我应该使用两个单独的查询

我想在查询中使用PDO fetchAll()返回它们的名字和姓氏以及包含所有项的子数组

因此,$result['First Name']、$result['First Name']、$result['product'][0]、$result['product'][1]、$result['product'][3]等都可以访问结果

当前报表:

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实际上对带有外部联接的查询有效地使用了适当的索引。