【问题标题】:Mysql order result by the sum of some similar column valuesMysql排序结果由一些相似列值的总和
【发布时间】:2013-04-14 10:09:55
【问题描述】:

有两个表,我试图从一个表中获取值并按另一个表中的值的总和排序。

所以为了清楚起见,我试图通过 meta_key 的总和来获取所有帖子的列表,其中 meta_key 类似于 reaction%

这是我尝试过的

ORDER BY ( SELECT SUM(CAST(meta_value AS UNSIGNED)) as count FROM `wp_postmeta` WHERE `meta_key` LIKE '_reaction_button%' GROUP BY post_id )

但不幸的是,这不起作用。那么有没有办法解决这个问题。我认为这可以使用视图或存储过程来完成,但要弄清楚如何。

实际上,我正在使用 wordpress 并使用 query_posts 来获取帖子,但似乎我无法使用 query_posts 或 WP_Query 执行此操作,这就是我编写自定义查询的原因。如果这可以通过 query_posts 或 WP_Query 完成,那就太好了。

【问题讨论】:

    标签: php mysql sql wordpress


    【解决方案1】:

    试试这个。

    首先创建一个临时表来保存总和值。然后与 wp_post 表进行连接,并在临时表的 sum 列上使用 order by

    CREATE TEMPORARY TABLE tempTable (postID int,countSum int)
    
    INSERT INTO tempTable
    SELECT post_id,SUM(CAST(meta_value AS UNSIGNED))
    FROM `wp_postmeta` 
    GROUP BY post_id
    
    
    SELECT wp_post.* FROM `wp_post`
    INNER JOIN tempTable
      ON wp_post.ID=tempTable.postID 
    ORDER BY countSUM
    
    DROP TABLE tempTable
    

    【讨论】:

    【解决方案2】:
    select p.*
    from 'wp_post' p
    join (
        select post_id, sum(cast(meta_value as unsigned)) as sum_val
        from 'wp_postmeta'
        where 'meta_key' like '_reaction_button%'
        group by post_id
    ) pm on p.post_id = pm.post_id
    order by pm.sum_val
    

    【讨论】:

      【解决方案3】:

      你真的不需要直接mysql,你可以WP_Query

      $query = new WP_Query( array ( 
                                   'post_type' => 'post', 
                                   'meta_key' => 'vote_field', 
                                   'orderby' => 'meta_value', 
                                   'order' => 'ASC' ) );
      

      您也可以使用meta_compare

      'meta_key' => 'metadata1',
      'orderby' => 'meta_value_num'
      

      那么你也可以使用'compare' => 'LIKE''compare' => 'NOT LIKE'

      或者您可以在此处查看此示例:Wordpress Sum meta_values from posts and order them per category 并将类别更改为您需要的内容..

      【讨论】:

      • 总和是什么意思?你不想订购它们吗?