Как я могу получить максимальную дату чужой таблицы в MySQL и вернуть только строку с этими данными без смешивания записей? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть несколько таблиц MySQL, из которых мне нужно присоединиться и вернуть данные.Возвращаемые данные должны показывать только одну строку для одной из таблиц JOINed, но MySQL смешивает строки.

Я пробовал разные методы, используя подзапросы и обычный JOIN с GROUP, но результаты остаются почти такими же.

Пример структуры таблицы

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 голосов
/ 03 апреля 2019

попробуйте запрос, подобный этому:

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
...