子查询多行

时间:2012-10-11 15:12:42

标签: mysql mysql-error-1064

如果我向子查询添加distinct,那么它会带来不同的行或多行.. ??

我有查询并收到错误

Subquery returns more than 1 row 

和查询就是这个

SELECT DISTINCT(o.order_id), (SELECT DISTINCT op.vendor_id FROM order_product op 
WHERE op.order_id = o.order_id) AS vendor_id, CONCAT(o.firstname, ' ', o.lastname) 
AS customer, CONCAT(o.shipping_address_1, o.shipping_address_2, o.shipping_city,',',
o.shipping_zone,',',o.shipping_country,'-',o.shipping_postcode) AS address, 
(SELECT os.name FROM order_status os WHERE os.order_status_id = o.order_status_id
AND os.language_id = '1') AS status, (SELECT delivery_boy_name FROM delivery_boys db
WHERE o.delivery_boy_id = db.delivery_boy_id) as delivery_boy, o.delivery_boy_id, 
o.order_status_id, o.total, (SELECT SUM(op.total) FROM order_product op WHERE 
op.order_id = o.order_id AND op.vendor_id = '37') AS total, (SELECT os.cost FROM 
order_shipping os WHERE os.order_id = o.order_id AND os.vendor_id = '37') AS 
shipping_cost, o.currency_code, o.currency_value, o.date_added, o.date_modified 
FROM `order` o LEFT JOIN `order_product` op ON (o.order_id = op.order_id) WHERE 
o.order_status_id > '0' AND op.vendor_id = '37' AND 
DATE(o.date_added) = DATE('2012-10-11') AND o.order_status_id NOT IN (6,7) 
ORDER BY o.date_added DESC

很抱歉这是太长的查询..我得到的错误是因为第二个子查询是这个

(SELECT DISTINCT op.vendor_id FROM order_product op 
WHERE op.order_id = o.order_id) AS vendor_id

在上面的子查询中,我的目标是从order_product表获取vendor_id,并且一个order_id将具有相同的vendor_id,这就是为什么我添加了distinct但仍然是mysql给出了多行的错误。

如何更改此查询.. ??提前谢谢。

2 个答案:

答案 0 :(得分:1)

“distinct”不会导致查询必须只返回一行。 “distinct”表示要消除重复的行。因此,如果要做一个简单的示例,您有一个包含一列的表,并且您有四个值为1,2,2和3的记录,那么选择without distinct将返回四行:1,2,2和3 .select distinct将返回三行:1,2和3。

您的查询相当复杂,所以我不确定您要完成的任务。您可以通过说“select ... limit 1”强制子查询只返回一行。或者你可以替换select子句中的所有字段 - 在这种情况下只是vendor_id,我想,有一个聚合,比如select max(vendor_id)。更有可能的是,您需要为where子句添加其他限制,因此只有一条记录符合条件。

如果您期望只有一个合格记录,但实际上有多个,那么问题是您的数据而不是查询。如果可以有多个,那么你需要找出你想要的那个,并修改查询只得到那个。

答案 1 :(得分:0)

Distinct将始终返回多行。您可以在某些条件下执行内部联接以限制行或在另一个特定条件下过滤行。