【问题标题】:ORDER BY in MYSQL with condition using a return of a functionMYSQL 中的 ORDER BY 条件使用函数的返回
【发布时间】:2015-02-18 03:05:51
【问题描述】:

我正在寻找解决方案;查询是:

            SELECT MAX(forum_commenti.Data) AS MData, forum_post.id AS id, forum_post.Nome AS Nome, forum_post.Messaggio AS Messaggio, forum_post.Sezione AS Sezione, forum_post.Data AS Data, forum_post.Utente AS Utente, forum_post.Chiuso AS Chiuso, forum_post.Importante AS Importante
            FROM forum_post LEFT OUTER JOIN forum_commenti ON forum_post.id = forum_commenti.Post
            WHERE forum_post.Importante = 0
            AND forum_post.Sezione = '".$_GET['id']."'
            GROUP BY id, Nome, Messaggio, Sezione, Data, Utente, Chiuso, Importante
            ORDER BY MData IS NOT NULL DESC, Data DESC
            LIMIT $start, $per_page

这是一个论坛的查询;我正在尝试显示数据的帖子顺序。我想要的是:

  • 如果帖子没有回复,请使用他自己的日期订购该帖子,否则使用该帖子的最后评论日期。 (其他信息无用)

我寻找解决了类似这样的旧问题,但是当我尝试这样做时它给了我问题:

ORDER BY MData IS NOT NULL DESC, Data ASC

上面写着“Reference 'MData' not supported (reference to group function)”。

我将该查询用于 php 函数。

查询涉及的表有:

  • forum_post : 包含论坛的所有帖子
  • forum_commenti : 包含所有帖子的所有回复,使用'Post'作为forum_post的外键

WHERE 条件对于查询来说是无用的点。

我会给你看例子:

发布 1 |最后回复的数据是 19/12/2014 10:00:00 ,帖子的数据是 19/12/2014 09:00:00 TAKE 上次评论的数据

后 2 |最后回复的数据为NULL(没有得到回复),post的数据是19/12/2014 08:00:00 获取帖子的数据

....... ………… 等等

现在我有了类似的东西:

发布 1 | 19/12/2014 10:00:00

后 2 | 19/12/2014 08:00:00

按数据排序

感谢大家的帮助。

【问题讨论】:

  • 不能用类似Oracle Decode的命令吗?如果存在,取最后评论日期,否则取发布日期,给出相同的名称,您可以按它订购
  • 我正在寻找类似的东西。我尝试使用“ORDER BY WHEN”,但警告仍然存在;我不能使用 MData,这是 SELECT (MAX) 中使用的聚合函数的返回。
  • 它不是那样使用的。使用 if (stackoverflow.com/questions/4706100/…) 进行子查询,但加载具有相同名称的数据,而不是聚合,例如从 myTable 中按数据 desc 限制 1 顺序选择数据,如果为 null 则发帖等
  • 好吧,我知道了,我试过了,我已经输入了一个 FROM 所有的查询,从 SELECT 到 GROUP BY;之后,在新的 SELECT 中,我放置了与第一个相同的字段,但使用了新的别名,它不会给我同样的错误。在外部查询的 ORDER BY 中,我插入了我在帖子中使用的条件(iS NOT NULL..),它工作正常,但我没有得到正确的结果。我将编辑主帖并显示我希望该查询的解决方案。
  • 好的,显示实际输出和想要的输出 =)

标签: php mysql phpmyadmin sql-order-by conditional-statements


【解决方案1】:

当使用首先选择帖子以及最新评论日期的子查询时,它可以工作。然后可以根据这两列上的表达式对结果进行排序。我使用IFNULL(last_post_date, own_date) 来选择正确的日期,并将其放在effective_date 列中以用于教学目的:

SELECT *, IFNULL(last_post_date, own_date) AS effective_date 
FROM (
  SELECT 
    forum_post.post_id, 
    forum_post.date AS own_date, 
    MAX(forum_comment.date) AS last_post_date 
  FROM forum_post 
  LEFT OUTER JOIN forum_comment 
  ON (forum_post.post_id = forum_comment.post_id) 
  GROUP BY post_id
) posts 
ORDER BY effective_date DESC;

请注意,我在回答中使用了稍微不同的表设置,因为原始表定义不可用,但它也适用于任何其他表设置。这是我的示例表:

CREATE TABLE `forum_post` (
  `post_id` int(11) NOT NULL AUTO_INCREMENT,
  `date` datetime DEFAULT NULL,
  PRIMARY KEY (`post_id`)
);
CREATE TABLE `forum_comment` (
  `comment_id` int(11) NOT NULL AUTO_INCREMENT,
  `post_id` int(11) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  PRIMARY KEY (`comment_id`)
);

我使用以下示例数据进行测试:

forum_post

+---------+---------------------+
| post_id | date                |
+---------+---------------------+
|       1 | 2014-12-01 00:00:00 |
|       2 | 2014-12-02 00:00:00 |
|       3 | 2014-12-02 00:00:00 |
|       4 | 2014-12-03 00:00:00 |
|       5 | 2014-12-03 00:00:00 |
|       6 | 2014-12-04 00:00:00 |
|       7 | 2014-12-06 00:00:00 |
|       8 | 2014-12-09 00:00:00 |
+---------+---------------------+

forum_comment

+------------+---------+---------------------+
| comment_id | post_id | date                |
+------------+---------+---------------------+
|          1 |       1 | 2014-12-01 00:00:00 |
|          2 |       1 | 2014-12-02 00:00:00 |
|          3 |       1 | 2014-12-03 00:00:00 |
|          4 |       2 | 2014-12-23 00:00:00 |
|          5 |       3 | 2014-12-09 00:00:00 |
|          6 |       3 | 2014-12-15 00:00:00 |
|          7 |       5 | 2014-12-15 00:00:00 |
|          8 |       7 | 2014-12-09 00:00:00 |
|          9 |       7 | 2014-12-11 00:00:00 |
+------------+---------+---------------------+

使用该数据,查询返回以下结果:

+---------+---------------------+---------------------+---------------------+
| post_id | own_date            | last_post_date      | effective_date      |
+---------+---------------------+---------------------+---------------------+
|       2 | 2014-12-02 00:00:00 | 2014-12-23 00:00:00 | 2014-12-23 00:00:00 |
|       3 | 2014-12-02 00:00:00 | 2014-12-15 00:00:00 | 2014-12-15 00:00:00 |
|       5 | 2014-12-03 00:00:00 | 2014-12-15 00:00:00 | 2014-12-15 00:00:00 |
|       7 | 2014-12-06 00:00:00 | 2014-12-11 00:00:00 | 2014-12-11 00:00:00 |
|       8 | 2014-12-09 00:00:00 | NULL                | 2014-12-09 00:00:00 |
|       6 | 2014-12-04 00:00:00 | NULL                | 2014-12-04 00:00:00 |
|       4 | 2014-12-03 00:00:00 | NULL                | 2014-12-03 00:00:00 |
|       1 | 2014-12-01 00:00:00 | 2014-12-03 00:00:00 | 2014-12-03 00:00:00 |
+---------+---------------------+---------------------+---------------------+

【讨论】:

    猜你喜欢
    • 2014-06-19
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2011-07-18
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多