我的查询每次都返回相同的(date2)

时间:2013-04-24 21:58:48

标签: mysql sql

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中的日期不同。

1 个答案:

答案 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.Date1o.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的第一个订单。

MySQL Docs

服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。此外,添加ORDER BY子句不会影响每个组中值的选择。

最后详细说明我对功能相关列的说法,因为在此数据集中OrderID是主键,根据ANSI标准,您可以写:

SELECT  OrderID, ProductID, Date1, Date2
FROM    T
GROUP BY OrderID;

所以,虽然我没有真正回答你的问题,但我希望能够证明你哪里出错了。你真的需要建立你想要通过小组实现的目标,如果你还没有解决方案,那么我会提出一个新的,更具建设性的问题,包括样本数据和预期输出以及明确的规则。为什么被驱逐的输出被驱逐。