MYSQL - 如何使用ORDER BY和LIMIT对列进行排序,然后按另一列对这些结果进行排序

时间:2014-10-30 21:07:01

标签: php mysql sql sorting

我目前正在使用MYSQL查询,该查询使用公式来确定行的相似性,然后根据它们的差异对它们进行排序。查询工作完美,但现在我想介绍LIMIT,我遇到了麻烦。我的原始查询如下。

SELECT t2.*, ABS(t1.v1-t2.v1)+ABS(t1.v2-t2.v2)+ABS(t1.v3-t2.v3) AS diff
FROM (SELECT * FROM tbl WHERE id=1) AS t1
JOIN tbl AS t2 ON t1.id <> t2.id
ORDER BY diff;

现在我引入了一个LIMIT表达式和两个ORDER BY语句,但它无法正常工作。我的最终目标是加入上面的表,然后按id行对表进行排序,将结果限制为10,然后通过diff ASC求助表。一切正常,直到diff的最终ORDER BY,它正在对id列进行排序,然后显示前10个结果,但不是通过diff重新排序结果。我一直在努力:

SELECT t2.*, ABS(t1.v1-t2.v1)+ABS(t1.v2-t2.v2)+ABS(t1.v3-t2.v3) AS diff
FROM (SELECT * FROM tbl WHERE id=1) AS t1
JOIN tbl AS t2 ON t1.id <> t2.id
ORDER BY id, diff LIMIT 10;

就像我之前说的那样,上面的查询只是将行按id排序并将结果限制为10,但不执行最终的ORDER BY DIFF。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

这是你想要的吗?

SELECT t.*
FROM (SELECT t2.*, ABS(t1.v1-t2.v1)+ABS(t1.v2-t2.v2)+ABS(t1.v3-t2.v3) AS diff
      FROM tbl t1 JOIN
           tbl t2
           ON t1.id <> t2.id and t1.id = 1
      ORDER BY t2.id
      LIMIT 10
     ) t
ORDER BY diff;

您的查询中有position。我不知道那是什么。此外,t1的子查询是不必要的。您可以在id子句中包含on