1

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

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

所以结果可以通过 $result['First Name'], $result['First Name'], $result['product'][0], $result['product'][1], $result[ '产品'][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'
4

3 回答 3

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在表上至少有一个匹配项: 。但是,如果您仍然希望客户记录显示/检索它是否在 table 上具有匹配值,请更改为(OUTER joinitemINNER JOINItemsINNER JOINLEFT JOIN

要了解有关联接的更多信息,请访问以下文章,

于 2013-01-16T00:22:47.473 回答
1

如果你只想返回一行,你可以添加一个 LIMIT 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)。


要从客户表中获取单行以及一个相关项目,那么您在 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 可以自由地返回满足谓词的任何行。随后的运行可能会返回不同的结果。这没有什么问题,但如果你不期待它可能会出乎意料。

于 2013-01-16T00:23:50.890 回答
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']);

的默认分隔符在使用 explodegroup_concat,可能非常危险,因此我们使用SEPARATOR '$^$'添加一堆不太可能出现的随机字符来代替。

于 2013-01-24T18:13:43.690 回答