如已提到的它是值得切换到新的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.Date1
和o.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;
所以,虽然我还没有真正回答我希望你的问题已经显示你出错的地方。你真的需要确定你正在努力实现的团队,如果你还没有找到解决方案,那么我会建议一个新的,更有建设性的问题,提供样本数据和预期的输出,并且有明确的规则为什么预计产出会被驱逐。
。 。你需要学习正确的连接语法。一旦用'join'编写它,你就不会有意想不到的笛卡尔产品的问题。 – 2013-04-24 22:01:06
Pleeease任何人? – marina 2013-04-24 22:05:49
@marina你看不到戈登的评论? – 2013-04-24 22:06:48