widziałem sporo rozwiązań na tego rodzaju problem, ale żaden z nich nie wydaje się być odpowiedni:Wybierz wiersze z MAX wartość pogrupowane według dwóch kolumn
mam następującą tabelę układ, o wersjonowanie załączników, które są zobowiązane do podmiotów:
TABLE attachments
+------+--------------+----------+----------------+---------------+
| id | entitiy_id | group_id | version_number | filename |
+------+--------------+----------+----------------+---------------+
| 1 | 1 | 1 | 1 | file1-1.pdf |
| 2 | 1 | 1 | 2 | file1-2.pdf |
| 3 | 1 | 2 | 1 | file2-1.pdf |
| 4 | 2 | 1 | 1 | file1-1.pdf |
| 5 | 2 | 1 | 2 | file1-2.pdf |
| 6 | 2 | 3 | 1 | file3-1.pdf |
+------+--------------+----------+----------------+---------------+
wyjścia powinna być maksymalna liczba wersji, pogrupowane według group_id i ENTITY_ID, że muszę tylko listę dla pojedynczych entity_ids czy to pomaga:
+------+--------------+----------+----------------+---------------+
| id | entitiy_id | group_id | version_number | filename |
+------+--------------+----------+----------------+---------------+
| 2 | 1 | 1 | 2 | file1-2.pdf |
| 3 | 1 | 2 | 1 | file2-1.pdf |
| 5 | 2 | 1 | 2 | file1-2.pdf |
| 6 | 2 | 3 | 1 | file3-1.pdf |
+------+--------------+----------+----------------+---------------+
Co mam wymyślić jest to samo dołączyć:
SELECT *
FROM `attachments` `attachments`
LEFT OUTER JOIN attachments t2
ON (attachments.group_id = t2.group_id
AND attachments.version_number < t2.version_number)
WHERE (t2.group_id IS NULL)
AND (`t2`.`id` = 1)
GROUP BY t2.group_id
Ale to działa tylko wtedy, gdy różne podmioty nie podzielają te same numery grup. Jest to niestety konieczne.
Podczas tworzenia widoku natknąłem się na działające rozwiązanie, ale nie jest to obsługiwane w mojej bieżącej konfiguracji.
Wszelkie pomysły są wysoko cenione. Dzięki!
Dziękujemy! Jest to bardzo proste rozwiązanie. –
Zapewniam przynajmniej, że dodasz klucz, który zasugerowałem, aby utrzymać wydajność tabeli, więc entitiy_id, group_id i numer_wersji. W swoim pytaniu określiłeś, że jest to identyfikator pojedynczego obiektu, a ta opcja będzie działała wolniej niż inne sugestie przy wyższych woluminach tabel, ponieważ identyfikator entity_id nie jest używany do ograniczania łączenia. –
-1 dla Non-ANSI –