选择按其他属性分组的提升项目

时间:2018-01-19 14:56:32

标签: mysql sql group-by

从下表中可以看出:

id | node_id | promoted | group_type | created_at         |status
------------------------------------------------------------------
8  |   4321  |    1     |     3      | 2018-01-08 13:29:55|   1 
4  |   4321  |    0     |     3      | 2018-01-06 11:22:53|   1 
3  |   4321  |    0     |     1      | 2018-01-05 23:19:02|   1 
2  |   4321  |    1     |     1      | 2018-01-05 21:20:15|   1 
1  |   4321  |    1     |     3      | 2018-01-05 11:09:51|   1 

每个id我必须获得一个group_typegroup_type个值。

如果组中有提升的项目,则查询应返回idgroup_type

如果组中有多个提升的项目,则应返回最近提升的记录。

如果组中没有提升的项目,查询应该返回最近的记录。

使用下面的查询我设法得到了我需要的几乎

SELECT a.id, a.group_type, a.promoted, a.created_at
 FROM ( 
       SELECT group_type, MAX(promoted) AS max_promoted
              FROM nodes
              WHERE node_id=4321 AND status=1
              GROUP BY group_type
      ) AS g
 INNER JOIN nodes AS a
 ON a.group_type = g.group_type AND a.promoted = g.max_promoted
 WHERE node_id= 4321 AND status=1 ORDER BY created_at

不幸的是,当组中有多个推广项目时,我得到了两个。

知道如何每组只获得一个推广项目吗?

修改 如果有多个组,则查询应返回多行但每组一行。

2 个答案:

答案 0 :(得分:0)

您可以通过在查询末尾添加LIMIT 0,1来限制查询结果。

如果您已经订购了结果,那么它将起作用。

有关LIMIT的更多信息,请参阅:https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html

答案 1 :(得分:0)

已编辑:您应该在if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { sharedElementEnterTransition = android.transition.TransitionInflater.from(context).inflateTransition(android.R.transition.move) } 中订购商品,以便根据需要获得最新的商品和descending件商品,例如1或2,依此类推。此外,limit将有助于获得最新结果,如果未提升,则提升。最后一个union将只生成单个(必需)行。这是您的查询:

limit

希望它有所帮助!