我想要做的就是从一个表中获取一些客户详细信息,并通过一个查询获取另一个表中的所有项目。我的子查询的当前问题是它将返回多于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'
答案 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 '$^$'
添加一堆不太可能出现的随机字符。