MySQL子查询问题

时间:2014-04-01 18:00:27

标签: mysql sql

SELECT * 
FROM (SELECT *
  FROM content
  WHERE topic='$id' AND active='1'
  ORDER BY date DESC, id DESC
  LIMIT 4) a
ORDER BY a.likes DESC

我有这个查询。我希望它从content表中选择4个条目,并按如下方式对条目进行排序:

  1. 选择最近的条目。它表示ORDER BY日期(mysql datetime)DESC,id DESC。

  2. 从选择的4个中,按喜欢(mysql INT)DESC

  3. 订购

    运行我的查询时,它返回错误的结果。它会选择符合此条件的条目WHERE topic='$id' AND active='1'。它按喜欢的DESC对条目进行排序,但忽略了这个标准ORDER BY date DESC, id DESC,因此它首先显示了ID较小的结果。

    可能是什么原因?提前谢谢

3 个答案:

答案 0 :(得分:3)

OP编辑后,正确的查询将是

SELECT * 
FROM (SELECT *
  FROM content
  WHERE topic='$id' AND active='1'
  ORDER BY date DESC, id DESC
  LIMIT 4) a
ORDER BY a.likes DESC, date DESC, id DESC

答案 1 :(得分:3)

最外层查询的ORDER BY指定返回行的顺序。没有保证或暗示其他行的顺序。

从原始问题(编辑之前)听起来像OP想要按likes列的整数值降序返回的行。也就是说,OP希望指定:

ORDER BY a.likes DESC

在最外面的查询。


查询返回的行将以最外层查询的ORDER BY定义的顺序返回。没有其他行的排序保证。

如果OP想要按特定顺序返回的行,则需要以不同方式指定最外层查询的ORDER BY子句中的表达式列表。例如:

ORDER BY a.likes DESC, a.date DESC, a.id DESC

- 或 -

ORDER BY a.date DESC, a.likes DESC, a.id DESC

内联视图查询将遵循内联视图中的ORDER BY;但是一旦内联视图查询具体化,并被外部查询引用为行源,那ORDER BY就消失了。外部查询可以按任意顺序自由访问并从内联视图(派生表)返回行;外部查询不需要在内联视图查询中遵守ORDER BY;外部查询只是将派生表看作行集,就像任何其他表一样。

(这假设“likes”是content表中的一列,而不是从其他表中派生的结果。我们看不到您的查询返回哪些列,因为您使用*作为SELECT列表。)

(如果这不是OP正在寻找的,OP可以详细说明指定结果集的要求。在OP查询中,其他所有内容都是正确的,用于获取内联视图中的四个“最新”行。)

答案 2 :(得分:0)

Try this:
SELECT *
  FROM content
  WHERE topic='$id' AND active='1'
  ORDER BY date DESC, likes desc
  LIMIT 4

You dont need another level of select to do order by.