Я нашел три вопроса, которые, кажется, все задают аналогичный вопрос:
Получение максимального значения из строк и присоединение к другой таблице
Выберите только строки по объединяемым таблицам максимальное значение
Объединение таблиц по максимальному значению
Но у меня возникают трудности с переносомОбдумайте, как именно объединять таблицы, сохраняя только максимальную строку одной из таблиц, когда максимум находится в самом поле id или index.
Я ищу ответы, которые требуют только объединений, потому что это позволит решению работать в инструменте, который генерирует запросы, для которых легко получить соответствующие генерации, хотя подзапросы, вероятно,выполнимо также с немного большим усилием.Я нашел ответ ниже, который представляет особый интерес:
SELECT DISTINCT b.id, b.filename, a1.name
FROM a a1
JOIN b
ON b.id = a1.id
LEFT JOIN a a2
ON a2.id = a1.id
AND a2.rank > a1.rank
WHERE a2.id IS NULL
Однако в моем случае столбец ранжирования также является индексом, например, "id".Я не могу сравнивать на равенство и большее, чем в одно и то же время, потому что они никогда не будут истинными одновременнонесколько столов (3-5 не редкость).Итак, в качестве упрощенного примера моего запроса:
SELECT
table1.field1, table1.field2, table1.field3,
table2.field1, table2.field2, table2.field3,
table3.field1, table3.field2, table3.field3,
table4.field1, table4.field2, table4.field3
FROM table1
INNER JOIN table2 ON
table1.field1 = table2.field1
AND table1.field2 = table2.field2
AND table2.field3 < 0
INNER JOIN table3 ON
table2.field1 = table3.field1
AND table2.field4 = table3.field4
INNER JOIN table4 ON
table1.field1 = table4.field1
AND table1.field2 = table4.field2
И что я хочу сделать, это устранить дубликаты в таблице 3, только получая строку с максимальным идентификатором (например, MAX (table3.id)) для каждогоуникальная комбинация всех других полей.То есть приведенный выше запрос возвращает что-то вроде этого:
+-------+-------+-------+---------+
| table1| table2| table4|table3 |
+-------+-------+-------+---------+
| A | A | A | 1,... |
| A | A | A | 2,... |
| A | A | A | 3,... |
| A | A | A | MAX2,...|
| B | B | B | 1,... |
| B | B | B | 2,... |
| B | B | B | 3,... |
| B | B | B | MAX2,...|
+-------+-------+-------+---------+
(я просто использую A и B, чтобы обозначить, что я говорю обо всех одинаковых значениях для полей в таблице1,table2 и table4 для определенного набора строк.)
, и я хочу уменьшить его до этого:
+-------+-------+-------+---------+
| table1| table2| table4|table3 |
+-------+-------+-------+---------+
| A | A | A | MAX1,...|
| B | B | B | MAX2,...|
+-------+-------+-------+---------+