MYSQL DISTINCT ORDER BY не дает правильный порядок - PullRequest
1 голос
/ 21 января 2012

Обновление: спасибо всем, теперь этот запрос работает на 100%:

SELECT e.entry_id
FROM exp_channel_titles AS e
INNER JOIN exp_matrix_data AS m ON m.entry_id = e.entry_id
WHERE e.channel_id = 2
GROUP BY e.entry_id
ORDER BY MIN(m.col_id_2) ASC

Вот мой код.

Код от .home_laagste_rentes

{exp:channel:entries dynamic="no" fixed_order="0{embed:entry_ids}" disable="member_data|pagination|categories"}
<tr class="{switch="odd|even"}">
    <td><a href="#" title="{title}">{title}</a></td>
    <td>{dk:lowest col="rente" decimals="2" dec_point=","}%</td>
    <td>{count}</td>
</tr>
{/exp:channel:entries}

Код со страницы:

<table id="rowspan" cellspacing="0" class="tablesorter">
<thead>
    <tr>
        <th>Krediet aanbieder</th>
            <th>Rente</th>
            <th>Beoordeling</th>
    </tr>
</thead>
<tbody>
{embed="embeds/.home_laagste_rentes"
entry_ids="{exp:query sql="
    SELECT DISTINCT (e.entry_id)
    FROM exp_channel_titles AS e
    INNER JOIN exp_matrix_data AS m ON m.entry_id = e.entry_id
    WHERE e.channel_id = 2
    ORDER BY m.col_id_2 ASC
"}|{entry_id}{/exp:query}"}
</tbody>

col_id_2 устанавливается как десятичное число (10,4)

entry_id устанавливается как int

Это фильтрация дубликатов, но она не дает правильный порядок. Похоже, что фильтрация дубликатов выполняется случайным образом ... Смотрите эту ссылку для вывода: http://postimage.org/image/9vzahuuez/

Ответы [ 2 ]

1 голос
/ 21 января 2012

У вас есть много, возможно, разные m.col_id_2 значений для одного e.entry_id.

Ваш запрос даже не является допустимым ANSI SQL, потому что ORDER BY оценивается после DISTINCT, поэтому ORDER BY m.col_id_2 должно создать ошибку (если ваш MySQL был строгим ANSI SQL).

Решение состоит в том, чтобы указать, какое значение следует использовать для упорядочения, используя GROUP BY вместо SELECT DISTINCT:

SELECT e.entry_id
FROM exp_channel_titles AS e
INNER JOIN exp_matrix_data AS m ON m.entry_id = e.entry_id
WHERE e.channel_id = 2
GROUP BY e.entry_id
ORDER BY MAX(m.col_id_2) ASC                  --- or MIN(), or AVG()
0 голосов
/ 21 января 2012

Я не знаю SCHEMA вашей таблицы, но вы можете попробовать этот запрос.

SELECT iTable.entry_id
FROM
    (SELECT DISTINCT e.entry_id, m.col_id_2
    FROM exp_channel_titles AS e INNER JOIN exp_matrix_data AS m 
                ON m.entry_id = e.entry_id
    WHERE e.channel_id = 2) as iTable
ORDER BY iTable.col_id_2 ASC
...