5

找到了类似的帖子,但仍然卡住 - 我在处理查询并限制结果后尝试应用排序。我的代码是

select DISTINCT(t.id) t_id, t.cart_id ,tS.id tS_id, tS.created tS_created, t.value, t.transactionType_id tT_id, tS.member_name, outIn, tT.type type

                            from(transaction t)
                            join transactionSummary tS ON tS.id = t.transactionSummary_id
                            left join transactionType tT ON tT.id = t.transactionType_id
                            order by t.id DESC
                            limit 50

我曾尝试进行子选择并在之后应用 ORDER BY,但在“字段列表”中出现错误提示“未知列”“t.id”。

上面的代码(即没有子选择)工作正常,但 ORDER BY 减慢了它的速度,因为表很大......有什么建议吗?

4

1 回答 1

4

由于您使用别名t.idt_id因此您需要在外部查询中使用别名。

SELECT *
FROM (select DISTINCT t.id t_id, t.cart_id ,tS.id tS_id, tS.created tS_created, t.value, t.transactionType_id tT_id, tS.member_name, outIn, tT.type type

    from transaction t
    join transactionSummary tS ON tS.id = t.transactionSummary_id
    left join transactionType tT ON tT.id = t.transactionType_id
    limit 50) x
ORDER BY t_id DESC

顺便说一句,您编写的方式DISTINCT(t.id)表明您认为 distinct 操作仅应用于该一列。DISTINCT适用于整个SELECT列表;如果您只想使某些列不同,则必须使用GROUP BY来指定这些列。

这是一种重写查询的可能方法,可以使其更快:

select DISTINCT t.id t_id, t.cart_id ,tS.id tS_id, tS.created tS_created, t.value, t.transactionType_id tT_id, tS.member_name, outIn, tT.type type
from transaction t
join (select max(id)-500 maxid from transaction) mT on t.id > maxid
join transactionSummary tS ON tS.id = t.transactionSummary_id
left join transactionType tT ON tT.id = t.transactionType_id
order by t_id DESC
limit 50

通过过滤到前 500 个 ID,可以减少连接和排序的大小。

于 2013-10-18T13:48:05.260 回答