【问题标题】:SQL query to sort要排序的 SQL 查询
【发布时间】:2016-12-17 20:56:11
【问题描述】:

我看到了餐桌产品和餐桌。每次客户查看产品时,都会在已查看表中为该产品添加一个条目。我想从产品表中检索所有产品的列表,并按查看次数的 desc 顺序对产品列表进行排序。注意,如果一个产品甚至没有被查看一次,那么在看到的表中将没有条目,并且该产品应放在列表顶部,然后是查看过一次、两次的产品,依此类推

SELECT products.product_id ,products.product_name , anon_1.seen_count
FROM products 
LEFT OUTER JOIN (
     SELECT seen.product_id , count(*) AS seen_count
     FROM seen 
     GROUP BY seen.product_id
     ) AS anon_1 ON anon_1.product_id = products.product_id  
ORDER BY anon_1.seen_count ASC;

我上面的查询将尚未查看的产品放在底部。我该如何解决? 我已经尝试过下降和上升。降序将观看次数最少的放在底部,升序将未观看的放在底部

【问题讨论】:

  • 您不能拥有“按 desc 顺序排列的产品列表(按查看次数的顺序排列)”和“该产品应放在列表顶部,然后是产品已同时查看一次、两次等
  • ... ORDER BY anon_1.seen_count NULLS FIRST Link
  • MySQL(可能)或 Postgresql?

标签: mysql sql postgresql sqlalchemy


【解决方案1】:

对于LEFT OUTER JOIN,您应该考虑products that haven't been viewedNULL 值。所以你应该使用这个:

SELECT products.product_id ,products.product_name, 
    COALESCE(anon_1.seen_count, 0) seen_count
FROM products 
LEFT OUTER JOIN (
     SELECT seen.product_id , count(*) AS seen_count
     FROM seen 
     GROUP BY seen.product_id
     ) AS anon_1 ON anon_1.product_id = products.product_id  
ORDER BY seen_count ASC;

【讨论】:

    【解决方案2】:

    按 anon_1.seen_count DESC 排序; 它将它们从最大值到最小值排序。

    你应该使用

     ORDER BY anon_1.seen_count ASC;
    

    从小到大排序。

    【讨论】:

    • 对不起,实际上我已经尝试了降序和升序。降序将观看次数最少的放在底部,升序将未观看的放在底部
    【解决方案3】:

    试试这个

    SELECT products.product_id ,products.product_name , CASE WHEN anon_1.seen_count IS NULL THEN 0 ELSE anon_1.seen_count END AS count
    FROM products 
    LEFT OUTER JOIN (
         SELECT seen.product_id , count(*) AS seen_count
         FROM seen 
         GROUP BY seen.product_id
         ) AS anon_1 ON anon_1.product_id = products.product_id  
    ORDER BY count DESC;
    

    【讨论】:

    • 嗯...这将导致由于ORDER BY count DESC 而未看到的产品位于底部,即它将从最大值到最小值。如果您希望未见产品位于顶部,即从最小到最大价值,请使用 ORDER BY count ASC
    【解决方案4】:

    在 Mysql 和 SqlServer 中,null 值是最小值。但是对于 Oracle,空值是最大值。 所以你可能会使用 MySql 或 SqlServer,对吧? 当前结果如下,我们需要将最后一个放在顶部,其中 seen_count 为空。

    为了做到这一点,我添加了一个额外的列来解决它。这符合你的需要吗?希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 2010-10-06
      • 2014-02-03
      • 2012-03-10
      相关资源
      最近更新 更多