mysql - SELECT COUNT() GROUP BY IN() mysql 中的一组数据

标签 mysql sql select count group-by

我的 table 是这样的

爱表(loves)

animal_id | user_id | time
   1          1
   2          1 
   1          3
   1          5
   2          3 
   3          1 

动物表(animal)

id | type   |   name
 1     air       animal 1 
 2     ground    animal 2
 3     water     animal 3
 4     space     animal 4
 5     air       animal 5  
 6     ground    animal 6

我的查询

( select count(*) from loves where animal_id = a.animal_id) as n_l,
 a.name 
FROM animal a ,loves lp 
WHERE a.animal_id =  lp.animal_id 
  AND lp.user_id = $MYUSERID  
  AND a.type IN ($MYANIMALTYPES) 
ORDER BY lp.time DESC 
LIMIT 5

现在如果 $MYUSERID = 1$MYANIMALTYPES = 'air','ground'

我应该得到上面示例的输出

n_l | name 
3     animal 1 
2     animal 2

但出于某种原因我想获得

的组合

$MYANIMALTYPES = '空气','地面' ,

$MYANIMALTYPES = '空气','水' ,

$MYANIMALTYPES = '空格',

$MYANIMALTYPES = '空间','水

在组中,我必须为每个 $MYANIMALTYPES 运行上述查询 4 ​​次。

我的问题是我对我想要的东西使用了太多的查询。有没有办法在一个查询中得到我想要的东西?

更新

为了简单理解我如何将下面的这两个查询组合成一个查询?

( select count(*) from loves where animal_id = a.animal_id) as n_l,
 a.name 
FROM animal a ,loves lp 
WHERE a.animal_id =  lp.animal_id 
  AND lp.user_id = $MYUSERID  
  AND a.type IN ('ground','air') 
ORDER BY lp.time DESC 
LIMIT 5

( select count(*) from loves where animal_id = a.animal_id) as n_l,
 a.name 
FROM animal a ,loves lp 
WHERE a.animal_id =  lp.animal_id 
  AND lp.user_id = $MYUSERID  
  AND a.type IN IN ('air','space') 
ORDER BY lp.time DESC 
LIMIT 5

最佳答案

您可以使用这种对查询的改编。它为您感兴趣的 4 种类型组合添加了一个连接:

SELECT      ( SELECT count(*)
              FROM   loves
              WHERE  animal_id = a.animal_id) as n_l,
            a.name,
            trim(concat(types.type1, ' ', types.type2)) grp
FROM        animal a 
INNER JOIN  loves lp 
         ON a.animal_id =  lp.animal_id  
INNER JOIN  ( SELECT 'air' type1, 'ground' type2
              UNION ALL
              SELECT 'air', 'water'
              UNION ALL
              SELECT 'space', ''
              UNION ALL
              SELECT 'space', 'water' ) AS types
         ON a.type IN (types.type1, types.type2)
WHERE       lp.user_id = $MYUSERID
GROUP BY    a.name,
            trim(concat(types.type1, ' ', types.type2))
ORDER BY    3, lp.time DESC 
LIMIT 15

我还将限制设置得更高,因为您现在将在一个查询中获得所有结果。

这是一个fiddle .

关于mysql - SELECT COUNT() GROUP BY IN() mysql 中的一组数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35975479/

相关文章:

mysql - 按 max() 其他列显示列

c# - mysql 搜索多个字段

php - 哪个Joomla版本低于2并且接近1.5。支持 PHP 5.4 吗?

MySql 转义\和 ' in a Like statement don' t 工作

MySql 在其他列条件下获取重复的 id

php - 选择没有值的所有行

mysql - 表列名称是 'default'

MySQL InnoDB 从表中删除数据行后未释放磁盘空间

sql - 根据另一个表中列的值对列使用检查约束

javascript - 尝试制作动态填充的链接选择框以在页面上显示特定图像