如何在MySQL中获取外部表的最大日期,并仅返回包含该数据的行而不混合记录?

时间:2019-04-03 18:17:01

标签: mysql datetime max

我有一些MySQL表,需要从中加入并返回数据。对于JOINed表之一,返回数据必须仅显示一行,但是MySQL混合了这些行。

我尝试了使用子查询和带有GROUP的普通JOIN的不同方法,但是结果几乎相同。

表格结构示例

suppliers
id name ...
1  ACME ...
2  EMCA ...
3  ORG  ...`

ratings
id supplier_id rating expiry_date report_file
1  1           5.0    2017-01-31  a.pdf
3  1           7.9    2019-06-30  c.pdf
4  2           5.0    2016-01-31  d.pdf
5  2           2.0    2018-11-30  g.pdf
6  245         9.5    2009-03-31  p.pdf

spends
id report_id supplier_id amount
1  1         1           150.00
2  1         2           100.00
3  1         245         200.00

以下是示例查询,我尝试解决此问题并返回没有运气的正确数据集。

SELECT 
    reports.id, 
    suppliers.id AS supplier_id, 
    suppliers.name, 
    ... 
    spends.amount, 
    ...  
    ratings.rating, 
    ratings.report_file, 
    ratings.expiry_date 

FROM reports 
    INNER JOIN spends ON reports.id=spends.report_id 
    INNER JOIN suppliers ON spends.supplier_id=suppliers.id 
    LEFT JOIN (
        SELECT id, 
            level,  
            report_file,  
            supplier_id, 
            MAX(expiry_date) AS expiry_date
        FROM ratings 
        GROUP BY supplier_id
    ) ratings ON (ratings.supplier_id=suppliers.id
        AND ratings.expiry_date >= reports.period_start)
    ... 
WHERE reports.id = 1 
GROUP BY spends.id  
ORDER BY spends.amount DESC

另一个查询

SELECT 
    reports.id, 
    suppliers.id AS supplier_id, 
    suppliers.name, 
    ... 
    spends.amount, 
    ...  
    ratings.rating, 
    ratings.report_file, 
    MAX(ratings.expiry_date) AS expiry_date 

FROM reports 
    INNER JOIN spends ON reports.id=spends.report_id 
    INNER JOIN suppliers ON spends.supplier_id=suppliers.id 
    LEFT JOIN ratings ON (ratings.supplier_id=suppliers.id
        AND ratings.expiry_date >= reports.period_start)
    ... 
WHERE reports.id = 1 
GROUP BY spends.id  
ORDER BY spends.amount DESC

我希望结果会

id supplier_id name  amount rating report_file expiry_date
1  1            ACME  150.00 7.9    c.pdf       2019-06-30
1  2            EMCA  100.00 2.0    g.pf        2018-11-30
1  245          MACE  200.00 null   null```

However, the actual output is

```sql
id supplier_id name  amount rating report_file expiry_date
1  1            ACME  150.00 5.0    a.pdf       2019-06-30
1  2            EMCA  100.00 5.0    d.pf        2018-11-30
1  245          MACE  200.00 null   null

请任何人建议我该如何解决。

1 个答案:

答案 0 :(得分:0)

尝试这样的查询:

SELECT 
    reports.id, 
    suppliers.id AS supplier_id, 
    suppliers.name, 
    ... 
    spends.amount, 
    ...  
    r.rating, 
    r.report_file, 
    r.expiry_date 

FROM reports 
    INNER JOIN spends ON reports.id=spends.report_id 
    INNER JOIN suppliers ON spends.supplier_id=suppliers.id 

    LEFT JOIN ratings r ON r.supplier_id=suppliers.id 
            AND r.`expire_date` = (
                SELECT MAX(`expire_date`) FROM ratings WHERE supplier_id = supplier.id GROUP BY supplier_id)
                ) as maxdate
    ... 
WHERE reports.id = 1 
GROUP BY spends.id  
ORDER BY spends.amount DESC