如前所述,为了清楚起见,值得切换到较新的 ANSI 92 JOIN 语法,这可以避免意外的交叉连接,因此您的查询将变为:
SELECT o.Date1, o.Date2
FROM customers AS c
INNER JOIN orders AS o
ON c.custid = o.custid
INNER JOIN temptable AS te
o.custid = te.custid
INNER JOIN products AS p
ON pi.prodno = te.prodno
INNER JOIN products_ids AS pi
ON p.productid = pi.productidD
WHERE te.custid = '24'
GROUP BY pi.productiD;
但是,这不是您的查询中的问题,问题在于您正在滥用 MySql 中的功能,您可以通过以下方式选择不属于该组的项目:
在这里,您告诉查询为 的每个不同值选择 1 行,每个和pi.ProductID
可能有多个不同的值,o.Date1
并且您没有向查询提供有关从这些多种可能性中进行选择的提示。o.Date2
pi.ProductID
ANSI 标准允许在 select 中使用不在 group by 中的列,但仅当 select 中的列在功能上依赖于 group by 中的列时,这很难遵守,因此大多数 DBMS 根本不允许列在不属于 group by 的 select 中。
为了演示考虑这个数据集(T)
OrderID ProductID Date1 Date2
1 1 20130401 20130402
2 1 20130402 20130403
3 2 20130403 20130404
4 2 20130404 20130405
5 2 20130405 20130406
如果(如您的情况)您做了:
SELECT OrderID, ProductID, Date1, Date2
FROM T
GROUP BY ProductID
你可能会得到:
OrderID ProductID Date1 Date2
1 1 20130401 20130402
3 2 20130403 20130404
只需为每个产品 ID 获取第一行,但是由于查询是不确定的,因此查询返回每个产品 ID 的最后一行同样正确:
OrderID ProductID Date1 Date2
2 1 20130402 20130403
5 2 20130405 20130406
这是一个常见的神话,添加 order by 将对此有所帮助,例如
SELECT OrderID, ProductID, Date1, Date2
FROM T
GROUP BY ProductID
ORDER BY OrderID;
MySql 在应用 order by 之前确定要返回的行,因此即使添加ORDER BY OrderID
也不能保证返回每个 productID 的第一个订单。
MySQL文档状态
服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。此外,从每个组中选择值不会受到添加 ORDER BY 子句的影响。
最后详细说明我所说的功能相关列,因为在这个数据集中OrderID
是一个主键,根据 ANSI 标准,你可以写:
SELECT OrderID, ProductID, Date1, Date2
FROM T
GROUP BY OrderID;
所以,虽然我还没有真正回答你的问题,但我希望已经表明你哪里出了问题。您确实需要通过 group by 确定您要实现的目标,如果您仍然没有解决方案,那么我会提出一个新的、更具建设性的问题,其中包含示例数据和具有明确规则的预期输出为什么expexted输出是expexted。