簡體   English   中英

如何在MySQL中獲取外部表的MAX日期並僅返回包含該數據的行而不混合記錄?

[英]How do I get the MAX date of foreign table in MySQL and return only the row with that data without mixing records?

我有一些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

請任何人都可以告訴我如何解決這個問題。

嘗試這樣的查詢:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM