我的 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/