SELECT o.Date1, o.Date2
FROM customers AS c, products AS p, products_ids AS pi, orders AS o, temptable AS te
WHERE p.productid = pi.productidD
AND pi.prodno = te.prodno
AND c.custid = o.custid
AND o.custid = te.custid
AND te.custid = '24'
GROUP BY pi.productiD
查询结果每次返回所有行的相同日期(一行),即使mysql中的日期不同。
答案 0 :(得分:1)
正如已经提到的,为了清楚起见,值得切换到较新的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中的功能,您可以通过以下方式选择不属于该组的项目:
在这里,您告诉查询为pi.ProductID
的每个不同值选择1行,o.Date1
和o.Date2
的每个pi.ProductID
可能有多个不同的值,并且您在查询中没有提示可以选择这些多种可能性中的哪一种。
ANSI标准允许使用select中不在group by中的列,但只有当select中的列在功能上依赖于group by中的列时,这很难遵守,因此大多数DBMS只是这样做不允许选择中不在组中的列。
演示考虑此数据集(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获取第一行,但由于查询是非确定性的,因此查询返回每个productID的最后一行同样正确:
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 OrderID
也不能保证返回每个productID的第一个订单。
服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。此外,添加ORDER BY子句不会影响每个组中值的选择。
最后详细说明我对功能相关列的说法,因为在此数据集中OrderID
是主键,根据ANSI标准,您可以写:
SELECT OrderID, ProductID, Date1, Date2
FROM T
GROUP BY OrderID;
所以,虽然我没有真正回答你的问题,但我希望能够证明你哪里出错了。你真的需要建立你想要通过小组实现的目标,如果你还没有解决方案,那么我会提出一个新的,更具建设性的问题,包括样本数据和预期输出以及明确的规则。为什么被驱逐的输出被驱逐。