Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如果每个字段的另一列为空,则按一列排序_Mysql_Sql_Sql Order By - Fatal编程技术网

Mysql 如果每个字段的另一列为空,则按一列排序

Mysql 如果每个字段的另一列为空,则按一列排序,mysql,sql,sql-order-by,Mysql,Sql,Sql Order By,我有两个表:Topics表和joined Comments表,都有时间戳列。我想对主题列表进行排序,以便最新评论的主题位于顶部。但是,如果一个主题没有注释,我希望它按创建日期排序。 换言之,我正试图对其进行排序,以便只有在没有评论的情况下,主题才会按照创建日期进行排序——基本上就像任何论坛一样。例如,如果主题A(空)是在主题B(非空)之后创建的,但主题B的回复是最近的,则顺序应为B,A。我不希望所有空主题都位于顶部(如果是旧主题),或者位于底部(如果是新主题) 我尝试了IF-ISNULL语句,但

我有两个表:Topics表和joined Comments表,都有时间戳列。我想对主题列表进行排序,以便最新评论的主题位于顶部。但是,如果一个主题没有注释,我希望它按创建日期排序。
换言之,我正试图对其进行排序,以便只有在没有评论的情况下,主题才会按照创建日期进行排序——基本上就像任何论坛一样。例如,如果主题A(空)是在主题B(非空)之后创建的,但主题B的回复是最近的,则顺序应为B,A。我不希望所有空主题都位于顶部(如果是旧主题),或者位于底部(如果是新主题)

我尝试了IF-ISNULL语句,但它适用于整个列,而不是每一行,因此我最终得到了空线程,它们要么卡在提要的顶部,要么卡在提要的底部

我猜我必须构建一个虚拟专栏,只包含每个主题的最新评论

以下是完整的声明:

SELECT
  $showbody,
  Topics.Title,
  Topics.id AS tID,
  Topics.Timestamp,
  Topics.MemberID,
  Users.id,
  Users.FirstName,
  Users.LastName,
  GROUP_CONCAT(DISTINCT Tags.Keywords SEPARATOR ', ') AS Tags,
  COUNT(Comments.id) AS NumberOfComments,
  (
    SELECT COUNT(Comments.id)
    FROM Comments
      LEFT JOIN Views ON Comments.TopicID = Views.TopicID
    WHERE Comments.Timestamp > Views.Visited
  ) AS NewComments
FROM Topics 
  LEFT JOIN Users ON Topics.MemberID = Users.ID 
  LEFT JOIN Comments ON Topics.id = Comments.TopicID 
  LEFT JOIN Tags ON Topics.id = Tags.TopicID 
WHERE Topics.id NOT IN (
  SELECT Tags.TopicID
  FROM Tags
  WHERE Keywords IN (
    SELECT Tag
    FROM Filters
    WHERE MemberID = '$_SESSION[SESS_MEMBER_ID]'
  )
  GROUP BY Tags.TopicID
) 
GROUP BY Topics.id 
ORDER BY Comments.Timestamp, Topics.Timestamp DESC LIMIT $plim

如果有任何帮助,我们将不胜感激。

对评论使用左连接,对主题进行分组,使用
max
获取最后一条评论的时间,如果有评论,则使用coalesce(或isnull)按评论日期排序,否则按创建日期排序

例如:

select t.Title, t.CreatedDate, max(c.CreatedDate) as LastComment
from Topics t
left join Comment c on c.TopicId = t.TopicId
group by t.Title, t.CreatedDate
order by coalesce(max(c.CreatedDate), t.CreatedDate) desc

对注释使用左连接,对主题进行分组,使用
max
获取最后一条注释的时间,如果有注释,则使用coalesce(或isnull)按注释日期排序,否则按创建日期排序

例如:

select t.Title, t.CreatedDate, max(c.CreatedDate) as LastComment
from Topics t
left join Comment c on c.TopicId = t.TopicId
group by t.Title, t.CreatedDate
order by coalesce(max(c.CreatedDate), t.CreatedDate) desc
解决方案1(演示):

结果:

2   Question 2  2011-01-01 02:00:00 2   2011-01-01 02:30:00
3   Question 3  2011-01-01 03:00:00     
1   Question 1  2011-01-01 01:00:00 1   2011-01-01 03:30:00
解决方案2:

SELECT  *
FROM    Topics t
LEFT JOIN
(
    SELECT  c.TopicID, MAX(Timestamp) LastTimestamp
    FROM    Comments c
    GROUP BY c.TopicID 
) c ON t.id = c.TopicID 
ORDER BY IFNULL(c.LastTimestamp, t.Timestamp) ASC
解决方案1(演示):

结果:

2   Question 2  2011-01-01 02:00:00 2   2011-01-01 02:30:00
3   Question 3  2011-01-01 03:00:00     
1   Question 1  2011-01-01 01:00:00 1   2011-01-01 03:30:00
解决方案2:

SELECT  *
FROM    Topics t
LEFT JOIN
(
    SELECT  c.TopicID, MAX(Timestamp) LastTimestamp
    FROM    Comments c
    GROUP BY c.TopicID 
) c ON t.id = c.TopicID 
ORDER BY IFNULL(c.LastTimestamp, t.Timestamp) ASC


你能在这里粘贴你的代码吗?请显示实际的SQL语句…你能在这里粘贴你的代码吗?请显示实际的SQL语句…这似乎不起作用,空线程停留在顶部,带有最新注释的线程停留在顶部bottom@Miles:我忘了按将
desc
放在
顺序中。这只会导致所有空线程都聚集在底部,这在某些方面更糟糕;如果有人创建了一个主题,它将被放在最后一页,没有人会看到它。相反地,如果是在提升那些没有人回答的老话题时,它将停留在最上面,而不是漂到最下面。我试图对活动中的线程进行排序,而不是根据它们是否有回复。@Miles:这就是此查询的作用。如果线程中有注释,它将使用最新的注释日期,如果线程中没有注释,它将使用线程创建日期。如果它不起作用,请检查您是否正确实现了它。这似乎不起作用,空线程停留在顶部,带有最新注释的线程停留在顶部bottom@Miles:我忘了将
desc
放在
order by
中。这只会导致所有的空线程聚集在底部,在某些方面更糟;如果有人创建了一个主题,它将被放在最后一页,没有人会看到它。相反地,如果是在提升那些没有人回答的老话题时,它将停留在最上面,而不是漂到最下面。我试图对活动中的线程进行排序,而不是根据它们是否有回复。@Miles:这就是此查询的作用。如果线程中有注释,它将使用最新的注释日期,如果线程中没有注释,它将使用线程创建日期。如果它不起作用,请检查您是否正确地实现了它。使用“orderbyifnull(MAX(Comments.Timestamp)、Topics.Timestamp)ASC”,我会一直在顶部获取空主题,在底部获取带有较新注释的主题。我做了什么不正确的事情吗?这种行为是正常的,因为
MAX(Comments.Timestamp)
(对于没有注释的主题)将
NULL
,并且
NULL
s将首先显示。试着使用我的方法。看看我最后一个关于
NULL
s排序顺序的例子。我试图对它进行排序,以便只有在没有评论的情况下,主题才会按创建日期排序——基本上就像任何论坛一样。例如,如果主题A(空)是在主题B(非空)之后创建的,但主题B有一个最新的回复,则顺序应为B,A。我不希望所有空主题都位于顶部,如果它们是旧的。“ORDER BY IFNULL(MAX(Comments.Timestamp)、Topics.Timestamp)ASC”与您编写的不是同义词吗?Thankshiles:看看第二个解决方案。使用“ORDER BY IFNULL(MAX(Comments.Timestamp),Topics.Timestamp)ASC”,我不断地在顶部得到空主题,在底部得到新注释的主题。我做了什么不正确的事情吗?这种行为是正常的,因为
MAX(Comments.Timestamp)
(对于没有注释的主题)将
NULL
,并且
NULL
s将首先显示。试着使用我的方法。看看我最后一个关于
NULL
s排序顺序的例子。我试图对它进行排序,以便只有在没有评论的情况下,主题才会按创建日期排序——基本上就像任何论坛一样。例如,如果主题A(空)是在主题B(非空)之后创建的,但主题B有一个最新的回复,则顺序应为B,A。我不希望所有空主题都位于顶部,如果它们是旧的。“ORDER BY IFNULL(MAX(Comments.Timestamp)、Topics.Timestamp)ASC”与您编写的不是同义词吗?感谢微笑:看看第二个解决方案。