2013-04-24 79 views
0
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内部不同)。我的查询返回每次相同(日期2)

+0

。 。你需要学习正确的连接语法。一旦用'join'编写它,你就不会有意想不到的笛卡尔产品的问题。 – 2013-04-24 22:01:06

+0

Pleeease任何人? – marina 2013-04-24 22:05:49

+0

@marina你看不到戈登的评论? – 2013-04-24 22:06:48

回答

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选择每行不同值的行,对于o.Date1o.Date2可能有多个不同的值每个pi.ProductID,并且您给这个查询没有提示这些多种可能性中的哪一种可供选择。

使用select中不在组中的列是ANSI标准允许的,但只有当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的第一行,但由于查询是非确定性的,因此查询将返回同样正确瓮最后一排的每个产品编号:

OrderID ProductID Date1  Date2 
2  1   20130402 20130403 
5  2   20130405 20130406 

它是一种常见的神话,通过增加订单将有助于这一点,例如

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; 

所以,虽然我还没有真正回答我希望你的问题已经显示你出错的地方。你真的需要确定你正在努力实现的团队,如果你还没有找到解决方案,那么我会建议一个新的,更有建设性的问题,提供样本数据和预期的输出,并且有明确的规则为什么预计产出会被驱逐。

+0

非常感谢所有这些!我很感激! – marina 2013-04-24 22:37:51

+0

+1。 。 。绝对值得赞赏。 – 2013-04-25 13:10:35