您正在尝试做的是从一个表中获取一些客户详细信息,并通过一个查询获取另一个表中的所有项目 . 我的子查询的当前问题是它将返回多于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 回答
尝试加入他们,
由于连接类型的定义,此查询将仅返回
customers
,其在表item
上具有至少一个匹配:INNER JOIN
. 但是,如果您仍希望客户的记录显示/检索表Items
上是否具有匹配值,请将INNER JOIN
更改为LEFT JOIN
(OUTER联接)要了解有关联接的更多信息,请访问以下文章,
我没有't think it'可以在一行中返回一个数组,但你可以做的是使用
group_concat
将值加入到一个字符串中,然后你可以在之后爆炸:group_concat
的默认分隔符是,
,这在使用explode时非常危险,所以我们使用SEPARATOR '$^$'
添加一堆不太可能出现的随机字符 .如果你想只返回一行,你可以添加一个限制1.但我不认为这是你想要的 .
如果要返回与客户关联的所有项目,可以使用LEFT JOIN,如下所示:
注意:
LEFT JOIN
将返回客户的所有行以及项目中的任何匹配行 . 如果某个客户在项目故事中没有任何行,则product
列将为NULL . 如果您要排除那些想要获取行的客户,请删除LEFT
关键字 . 缺少LEFT
关键字相当于指定不必要的关键字INNER
) .要从customers表中返回单行,以及只有一个相关项,那么使用SELECT列表中的子查询的方法可能会有效 .
但是您不需要在该子查询中执行JOIN操作,您可以引用外部查询中的值(使其成为相关子查询) . 这里的关键是在子查询中添加LIMIT 1以确保它返回不超过1行 .
ORDER BY不是必需的,但它使结果集具有确定性 . 也就是说,如果没有ORDER BY,MySQL可以自由地返回满足谓词的任何一行 . 随后的运行可能会返回不同的结果 . 这没有什么不对,但如果你不期待它可能会出乎意料 .
我假设名字和姓氏是客户表中的columsn . 我认为这更符合您对此查询的要求:
SELECT
First Name
,Last Name
,items
.Product Name
AS product FROMitems
INNER JOINcustomers
ONcustomers
.Customer No
=items
.Customer No
WHEREcustomers
.Customer No
= 6;