MySQL - Управление, которым строка возвращается группой

Символьная печать XML для python выглядит довольно хорошо для этой задачи. (Соответственно названо тоже.)

Альтернативой является использование pyXML , который имеет функцию PrettyPrint .

56
задан benlumley 11 February 2009 в 15:06
поделиться

7 ответов

Это назвало выбор мудрого группой максимума столбца. Вот несколько разных подходов для 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, подзапрос мог быть миллионами строк задолго до того, как это произошло, но выбор * подзапрос в Вашем первом запросе мог пострадать от этой проблемы намного раньше.

49
ответ дан ʞɔıu 7 November 2019 в 16:52
поделиться
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), если у Вас есть один (который я думаю, что Вы должны)

2
ответ дан Quassnoi 7 November 2019 в 16:52
поделиться

Я думаю, что это сделало бы это, не уверенный, если это является лучшим или самым быстрым все же.

SELECT * FROM table 
WHERE (id, version_id) IN 
  (SELECT id, MAX(version_id) FROM table GROUP BY id)
3
ответ дан Ikke 7 November 2019 в 16:52
поделиться

Я обычно делаю это с подзапросом:

избранный идентификатор, version_id, field1, field2 из таблицы данных как dt, где идентификатор = (выбирают идентификатор из таблицы данных, где идентификатор = dt.id порядок version_id desc ограничивают 1)

0
ответ дан mcassano 7 November 2019 в 16:52
поделиться

Это - псевдо код, но что-то вроде этого должно работать просто великолепно

select *
from table
inner join
(
    select id , max(version_id) maxVersion
    from table 
) dvtbl ON id = dvtbl.id && versionid = dvtbl.maxVersion
0
ответ дан ConroyP 7 November 2019 в 16:52
поделиться

Я думаю, что это - то, что Вы хотите.

select id, max(v_id), field1, field2 from table group by id

результаты я добираюсь от этого,

1, 2, textb, text2

2, 3, текст, Редактирование text5

: я воссоздал таблицу, и вставьте те же данные с идентификатором version_id, являющийся составным первичным ключом. Это дало ответ, который я предоставил ранее. Это было также в MySQL.

-1
ответ дан Berek Bryan 7 November 2019 в 16:52
поделиться

not tested it but something like this might work:

SELECT * FROM table GROUP BY id ORDER BY MAX(version_id) DESC

-2
ответ дан 26 November 2019 в 17:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: