简体   繁体   English

相同查询的Python3脚本未显示与MySQL引擎相同的结果

[英]Python3 script not showing same result as MySQL engine for same query

My python3 script is not generating the same result as MySQL. 我的python3脚本无法生成与MySQL相同的结果。 My query returns those rows whose value have changed over the week. 我的查询返回其值在一周内已更改的那些行。

Python script: Python脚本:

query = "SELECT cw.opportunityid, cw.probability, pw.probability, cw.stage, pw.stage, cw.amount, pw.amount, " \
    "cw.closedate, pw.closedate " \
    "FROM opty_data cw " \
    "LEFT JOIN opty_data pw ON cw.opportunityid = pw.opportunityid " \
    "AND pw.Week = \"{0}\" " \
    "WHERE cw.Week = \"{1}\" " \
    "AND IF(pw.opportunityid IS NULL, TRUE, ((cw.probability <> pw.probability) OR (cw.stage <> pw.stage) " \
    "OR (cw.Amount<>pw.Amount) OR (cw.CloseDate <> pw.CloseDate)))".format(Prev_Week,Curr_Week)
cursor.execute(query)
results = dictfetchall(cursor)
print(results)

Output: 输出:

[{
        'opportunityid' : '1',
        'probability' : '50',
        'amount' : Decimal('30.35'),
        'closedate' : datetime.date(2016, 8, 22),
        'stage' : 'Proposal'
    }, {
        'opportunityid' : '2',
        'probability' : '50',
        'amount' : Decimal('115.00'),
        'closedate' : datetime.date(2016, 6, 30),
        'stage' : 'Proposal'
    }, {
        'opportunityid' : '3',
        'probability' : '50',
        'amount' : Decimal('200.00'),
        'closedate' : datetime.date(2016, 8, 29),
        'stage' : 'Proposal'
    }
]

Query: 查询:

SELECT cw.opportunityid, cw.probability, pw.probability, cw.stage, pw.stage, cw.amount, pw.amount, cw.closedate, pw.closedate FROM opty_data cw 
LEFT JOIN opty_data pw 
ON cw.opportunityid = pw.opportunityid AND pw.Week = "2016-35" WHERE cw.Week = "2016-36" 
AND IF(pw.opportunityid IS NULL, TRUE, ((cw.probability <> pw.probability) OR (cw.stage <> pw.stage) OR (cw.Amount<>pw.Amount) OR (cw.CloseDate <> pw.CloseDate)))

Expected Output shown correctly by MySQL: MySQL正确显示了预期的输出:

+-----------------+-------------+-------------+----------------+----------------
+------------+-------------+------------+------------+
| opportunityid   | probability | probability | stage          | stage
| amount     | amount      | closedate  | closedate  |
+-----------------+-------------+-------------+----------------+----------------
+------------+-------------+------------+------------+
| 1 | 50          | 50          | Proposal       | Proposal
|   20.35 |    30.35 | 2016-08-22 | 2016-08-22 |
| 2 | 50          | 50          | Proposal       | Proposal
|  113.00 |    115.00 | 2016-09-06 | 2016-06-30 |
| 3 | 0           | 50          | Drop           | Proposal
|  200.00 |   200.00 | 2016-08-29 | 2016-08-29 |

A Python dictionary consists of unique key value pairs, so one key can just appear once in a dictionary. Python词典由唯一的键值对组成,因此一个键只能在词典中出现一次。 As your raw SQL query returns two distinct values from the same column in a single row, the second occurrence of the column overwrites the first in the dictionary. 当您的原始SQL查询在同一行中从同一列返回两个不同的值时,列的第二次出现将覆盖字典中的第一个。 However, you can easily fix this by specifying aliases for the columns using the AS keyword. 但是,您可以通过使用AS关键字为列指定别名来轻松解决此问题。 Check out the following example: 查看以下示例:

SELECT 
    p1.name AS p1name, 
    p2.name AS p2name 
FROM 
    p1, p2 
WHERE 
    p1.id != p2.id

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM