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

标签 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 内部的日期不同。

最佳答案

正如已经提到的,为了清晰起见,值得切换到较新的 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 的第一行,但由于查询是不确定的,因此查询返回每个产品 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 Docs状态

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

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

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

所以,虽然我没有真正回答你的问题,但我希望已经表明你哪里出了问题。您确实需要确定小组想要实现的目标,如果您仍然没有找到解决方案,那么我会建议一个新的、更具建设性的问题,其中包含示例数据和预期输出,并具有明确的规则为什么expexted输出是expexted。

关于mysql - 我的查询每次返回相同的(date2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16202948/

相关文章:

MySQL - 将查询结果分配给变量

mysql - SQL如何根据组中现有列的计数为新列创建值?

php - MySQL 普通查询 vs Join 查询不同的结果

SQL:SQL 异或

mysql - SQL 查询 Ruby On Rails

php - mysql 代码中重复输入 key 'PRIMARY'

mysql - Laravel Eloquent 模式搜索无法正常工作

php - 在 Laravel 5.2 中按 id 显示图像文件

php - 无法在 MySQL 中存储 UTF8 字符

python - 我正在尝试将数据框插入本地 MySQL 数据库