Символьная печать XML для python выглядит довольно хорошо для этой задачи. (Соответственно названо тоже.)
Альтернативой является использование pyXML , который имеет функцию PrettyPrint .
Это назвало выбор мудрого группой максимума столбца. Вот несколько разных подходов для mysql.
Вот то, как я сделал бы это:
SELECT *
FROM (SELECT id, max(version_id) as version_id FROM table GROUP BY id) t1
INNER JOIN table t2 on t2.id=t1.id and t1.version_id=t2.version_id
Это будет относительно эффективно, хотя mysql составит временную таблицу в памяти для подзапроса. Я предполагаю, что у Вас уже есть индекс на (идентификатор, version_id) для этой таблицы.
Это - дефицит в SQL, что более или менее необходимо использовать подзапрос для этого типа проблемы (, полуобъединения являются другим примером).
Подзапросы не хорошо оптимизированы в mysql, но некоррелированые подзапросы не так плохи, пока они не так огромны, что они будут записаны в диск, а не память. Учитывая, что в этом запросе только имеет два ints, подзапрос мог быть миллионами строк задолго до того, как это произошло, но выбор * подзапрос в Вашем первом запросе мог пострадать от этой проблемы намного раньше.
SELECT id, version_id, field1, field2
FROM (
SELECT @prev = id AS st, (@prev := id), m.*
FROM (
(SELECT @prev := NULL) p,
(
SELECT *
FROM mytable
ORDER BY
id DESC, version_id DESC
) m
) m2
WHERE NOT IFNULL(st, FALSE);
Никакие подзапросы, каждый передает UNIQUE INDEX ON MYTABLE (id, version_id)
, если у Вас есть один (который я думаю, что Вы должны)
Я думаю, что это сделало бы это, не уверенный, если это является лучшим или самым быстрым все же.
SELECT * FROM table
WHERE (id, version_id) IN
(SELECT id, MAX(version_id) FROM table GROUP BY id)
Я обычно делаю это с подзапросом:
избранный идентификатор, version_id, field1, field2 из таблицы данных как dt, где идентификатор = (выбирают идентификатор из таблицы данных, где идентификатор = dt.id порядок version_id desc ограничивают 1)
Это - псевдо код, но что-то вроде этого должно работать просто великолепно
select *
from table
inner join
(
select id , max(version_id) maxVersion
from table
) dvtbl ON id = dvtbl.id && versionid = dvtbl.maxVersion
Я думаю, что это - то, что Вы хотите.
select id, max(v_id), field1, field2 from table group by id
результаты я добираюсь от этого,
1, 2, textb, text2
2, 3, текст, Редактирование text5
: я воссоздал таблицу, и вставьте те же данные с идентификатором version_id, являющийся составным первичным ключом. Это дало ответ, который я предоставил ранее. Это было также в MySQL.
not tested it but something like this might work:
SELECT * FROM table GROUP BY id ORDER BY MAX(version_id) DESC