子查询返回超过1行

时间:2013-01-16 00:19:15

标签: php mysql sql select

我想要做的就是从一个表中获取一些客户详细信息,并通过一个查询获取另一个表中的所有项目。我的子查询的当前问题是它将返回多于1行并导致错误。有没有办法解决这个问题,还是应该使用2个单独的查询?

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

结果可以通过$ result ['名字'],$ result ['名字'],$ result ['产品']访问结果[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'

3 个答案:

答案 0 :(得分:1)

尝试加入他们,

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'

由于联接的定义类型customers,此查询将仅返回表item上至少有一个匹配项的INNER JOIN。但是,如果您仍希望客户的记录显示/检索表Items上是否具有匹配值,请将INNER JOIN更改为LEFT JOIN OUTER join

要了解有关加入的详情,请访问以下文章

答案 1 :(得分:1)

如果你想只返回一行,你可以添加一个限制1.但我认为这不是你想要的。

如果要返回与客户关联的所有商品,可以使用LEFT JOIN,如下所示:

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列将为NULL。如果您要排除没有任何商品的客户(如果您不想退回行),请删除LEFT关键字。缺少LEFT关键字相当于指定不必要的关键字INNER)。


要从customers表中获取单行,以及只有一个相关项,那么使用SELECT列表中的子查询的方法可能会有效。

但是您不需要在该子查询中执行JOIN操作,您可以引用外部查询中的值(使其成为相关子查询)。这里的关键是在子查询中添加LIMIT 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不是必需的,但它使结果集具有确定性。也就是说,如果没有ORDER BY,MySQL可以自由地返回满足谓词的任何一行。随后的运行可能会返回不同的结果。这没有什么不对,但如果你不期待它可能会出乎意料。

答案 2 :(得分:1)

我认为不可能在一行中返回一个数组,但你可以做的是使用group_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的默认分隔符为,,使用爆炸时可能非常危险,因此我们使用SEPARATOR '$^$'添加一堆不太可能出现的随机字符。