2015-10-21 26 views
1

的数我有一个表,其结构如下取名称时不同的名称小于200的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)),但这似乎并不按我想的方式工作。我非常震惊,这是一个主要的性能问题。任何帮助深表感谢。提前致谢。

回答

1

你可以尝试这样的:

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

'COUNT(DISTINCT APP_ID)'始终是1,因为查询执行'GROUP BY app_id'。因此,这个查询只是获取表中包含的所有'app_id'值。 –

+1

谢谢拉胡尔,像一个魅力工作。我稍微修改了查询以满足我的要求,并且它的工作非常完美。非常感谢:) –

+0

@SathiyaNarayanan我看不出这个查询可能如何工作。 'HAVING'子句中的'COUNT(distinct app_id)'总是'1'。如果我错了,请纠正我。 –

-1

使用限制只会返回前200个结果。

SELECT DISTINCT ap_id FROM appTable LIMIT 200

,然后如果你需要得到下一个200,然后使用偏移200将与排发车201

SELECT DISTINCT ap_id FROM ap_Table LIMIT 200 OFFSET 200 
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