<p>首先,让我们澄清一下:<code>DISTINCT</code>是标准SQL,而{<cd2>}是PostgreSQL扩展。在</p>
<p>错误(<code>DISTINCT ON expressions must match initial ORDER BY expressions</code>)表示,您应该修复<code>ORDER BY</code>子句,而不是<code>DISTINT ON</code>(如果这样做,您将得到不同的结果,就像您已经经历过的那样)。在</p>
<blockquote>
<p>The <a href="http://www.postgresql.org/docs/current/static/sql-select.html#SQL-DISTINCT" rel="nofollow"><code>DISTINCT ON</code></a> expression(s) must match the leftmost ORDER BY expression(s). The ORDER BY clause will normally contain additional expression(s) that determine the desired precedence of rows within each DISTINCT ON group.</p>
</blockquote>
<p>这将为您提供预期结果:</p>
<pre><code>lstPairs = Pair.objects.order_by('track1__id','-popularity').distinct('track1__id')[:iNumPairs].values_list('track1__id', 'track2__id', 'popularity')
</code></pre>
<p>在SQL中:</p>
^{pr2}$
<p><strong>但<em>可能是顺序错误。</strong></p>
<p>如果您想要原始订单,可以在此处使用子查询:</p>
<pre><code>SELECT *
FROM (
SELECT DISTINCT ON (track1__id) track1__id, track2__id, popularity
FROM pairs
ORDER BY track1__id
LIMIT here, if necessary
)
ORDER BY popularity DESC, track1__id
</code></pre>