【问题标题】:Conditional Distinct in MYSQL with respect o another columnMYSQL中关于另一列的条件不同
【发布时间】:2012-10-08 13:21:48
【问题描述】:

我有如下查询

SELECT * FROM content_type_product cp
JOIN content_field_product_manufacturer cf ON cf.nid = cp.nid group by cp.nid
ORDER
  BY field(cf.field_product_manufacturer_value,'12') DESC,
  cp.field_product_price_value DESC

这是完美的工作只是一个小缺陷,有两个具有相同 id 的记录(一个用于 cf.field_product_manufacturer_value='12',另一个用于 cf.field_product_manufacturer_value = '57'),我使用 group by 子句消除了.但问题是我想获得具有更大“field_product_price_value”的特定ID,但不知何故它给了我较小的价值。如果我查询它为“57”,那么它给我的 id 具有更大的 field_product_price_value,但是当我查询它为“12”时,它给我的 id 为较小的“field_product_price_value”。有什么方法可以指定选择具有更大“field_product_price_value”的id

【问题讨论】:

  • 使用列列表,避免SELECT *

标签: mysql join sql-order-by


【解决方案1】:

您应该将max(field_product_price_value) 与适当的 GROUP BY 子句结合使用。

一般来说,只有在查询中同时选择普通列和聚合函数 (MIN, MAX, COUNT, AVG) 时,才应使用 GROUP BY-clause。

【讨论】:

    【解决方案2】:

    您的查询使用了 MySQL 的一个(错误)功能,称为隐藏列。仅当 SELECT 而不是 GROUP BY 中的所有未聚合列具有相同的值时,才建议这样做。事实并非如此,因此您需要自己选择正确的记录:

    SELECT cp.*, cf.*
    FROM content_type_product cp JOIN
         content_field_product_manufacturer cf
         ON cf.nid = cp.nid join
         (select cf.nid, max(field_product_price_value) as maxprice
          from content_field_product_manufacturer 
          group by cf.nid
         ) cfmax
         on cf.nid = cfmax.nid and cf.field_product_price_value = cfmax.maxprice
    ORDER BY field(cf.field_product_manufacturer_value,'12') DESC,
          cp.field_product_price_value DESC
    

    除非您真的知道自己在做什么,否则当您使用GROUP BY 时,请确保SELECT 中的所有未聚合列都在GROUP BY 中。

    【讨论】:

      【解决方案3】:
      '2' > '12'
      

      如果我们谈论的是 varchars。我相信您应该将您的字段转换为数字类型,并且您的排序会正常工作。阅读此article 了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        • 2021-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-15
        相关资源
        最近更新 更多