【问题标题】:mysql left join order by null values to the endmysql左连接顺序按空值到最后
【发布时间】:2010-12-01 16:09:41
【问题描述】:

mysql

SELECT * FROM media
LEFT JOIN media_priority
ON (media_priority.media_id = media.id AND media_priority.media_tag = '".$tag."')
WHERE something = 'something'
ORDER BY media_priority.media_order;

这很好用,只是 media_priority.media_order 有时返回为 null 并且 mysql 将 null 值放在顶部。

所以我试图弄清楚如何使用左连接执行 IS NULL AS tempcol 语句,这样我就可以先排序.....我似乎无法正确使用语法。

我应该将 IS NULL 语句放在上面的查询中的什么位置?

我在想这样的事情:

LEFT JOIN media_priority
ON (media_priority.media_id = media.id AND media_priority.media_tag = '".$tag."')
media_priority.media_order IS NULL AS isnull

但这不起作用。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我建议先按 media_priority.media_order IS NULL 的布尔值排序,然后按列值排序,以强制将 NULL 放在末尾。

    像这样:

    SELECT * FROM media
    LEFT JOIN media_priority
    ON (media_priority.media_id = media.id AND media_priority.media_tag = '".$tag."')
    WHERE something = 'something'
    ORDER BY (media_priority.media_order IS NULL) ASC, media_priority.media_order ASC;
    

    【讨论】:

      【解决方案2】:
      ORDER BY 
          CASE WHEN media_priority.media_order IS NULL THEN 1 ELSE 0 END, 
          media_priority.media_order;
      

      如果您有某个上限,media_order 永远无法达到,请使用幻数。

      ORDER BY 
          COALESCE( media_priority.media_order,99999999);
      

      第一种方法显然更安全一些!

      【讨论】:

      • 你的回答比我的好。我过去也这样做过,不知道为什么我没有想到。
      • 完美。我使用了第一个建议。
      猜你喜欢
      • 2011-11-27
      • 2017-07-01
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多