首页 文章

子查询返回超过1行

提问于
浏览
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 回答

  • 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联接)

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

  • 1

    我没有't think it'可以在一行中返回一个数组,但你可以做的是使用 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 的默认分隔符是 , ,这在使用explode时非常危险,所以我们使用 SEPARATOR '$^$' 添加一堆不太可能出现的随机字符 .

  • 0

    如果你想只返回一行,你可以添加一个限制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可以自由地返回满足谓词的任何一行 . 随后的运行可能会返回不同的结果 . 这没有什么不对,但如果你不期待它可能会出乎意料 .

  • 1

    我假设名字和姓氏是客户表中的columsn . 我认为这更符合您对此查询的要求:

    SELECT First NameLast Nameitems . Product Name AS product FROM items INNER JOIN customers ON customers . Customer No = items . Customer No WHERE customers . Customer No = 6;

相关问题