当不同名称的数量小于200 mysql时获取名称

时间:2015-10-21 05:36:45

标签: mysql

我有一个结构如下的表

╔════════╦══════════╦════════════╗
║ app_id ║ app_name ║ categoryId ║
╠════════╬══════════╬════════════╣
║  1200  ║    A     ║     B      ║
║  1200  ║    A     ║     C      ║
║  1200  ║    A     ║     D      ║
║  1201  ║    E     ║     F      ║
║  1201  ║    E     ║     G      ║
╚════════╩══════════╩════════════╝

现在我有1600个这样的数据。我想要得到的是一个获取数据的查询,直到不同appid的数量达到200.达到200后,它应该不再获取其余的数据。我尝试了count(distinct(app_id)),但这似乎不像我想的那样工作。我真的很震惊,这是一个重大的性能问题。任何帮助深表感谢。提前谢谢。

3 个答案:

答案 0 :(得分:1)

您可以尝试这样:

SELECT app_id  
FROM myTable
GROUP BY app_id 
HAVING COUNT(distinct app_id) < 200;

答案 1 :(得分:1)

如果你想要的是

  

获取数据的查询,直到不同appid的数量达到200

然后你可以使用变量来实现这个:

SELECT app_id, app_name, categoryId
FROM (
  SELECT app_id, app_name, categoryId,
         @appIDcnt := IF (@appID = app_id,
                          IF(@appID := app_id, @appIDcnt, @appIDcnt),
                          IF(@appID := app_id, @appIDcnt+1, @appIDcnt+1)) AS cnt
  FROM mytable
  CROSS JOIN (SELECT @appID := 0, @appIDcnt := 0) AS vars
  ORDER BY app_id ) AS t
WHERE t.cnt <= 200

在上面的查询中,@appIDcnt变量用于计算不同的app_id值。查询将获取表数据,直到@appIDcnt值达到200。

Demo here

答案 2 :(得分:-1)

使用限制它将仅返回前200个结果。

SELECT DISTINCT ap_id FROM appTable LIMIT 200

然后如果您需要获得下一个200,那么使用偏移200,它将从第201行开始

SELECT DISTINCT ap_id FROM ap_Table LIMIT 200 OFFSET 200