MYSQL查询匹配计数

时间:2014-11-06 15:55:11

标签: mysql nested-queries

我有一个MySQL问题,我似乎无法弄明白。

我有两个查询和一些PHP,我认为应该可以将它合并到一个查询中。

我想要做的是:显示所有用户已完成某个程序的所有模块,ID = 1

查询1 - >这给了程序的所有模块:

SELECT `id` 
FROM `modules` 
JOIN `linkModuleProgramm` ON `module`.`id` = `linkModuleProgramm`.`module` 
WHERE `linkModuleProgramm`.`programm` = 1

查询2 - >这给了用户以及该用户完成的程序模块数量:

SELECT `user`.`id`, 
COUNT(*) as 'count' 
FROM `user` 
JOIN `linkUserModule` ON `user`.`id` = `linkUserModule`.`user` 
WHERE `linkUserModule`.`status` = 1 
AND `linkUserModule`.`module` IN (Query1) 
GROUP BY `user`.`id`

然后PHP过滤来自Query2的用户,其中'count'等于来自Query1的结果数。

有人有建议吗?

1 个答案:

答案 0 :(得分:0)

看起来我第一次没有理解你的问题。另一个尝试,使用两个查询和MySQL变量:

SET @MODULESCOUNT = (
   SELECT COUNT(*) 
   FROM `modules` 
   JOIN `linkModuleProgramm` ON `module`.`id` = `linkModuleProgramm`.`module` 
   WHERE `linkModuleProgramm`.`programm` = 1 
   );
SELECT `user`.`id`, 
 FROM `user` 
  JOIN `linkUserModule` ON `user`.`id` = `linkUserModule`.`user` 
 WHERE `linkUserModule`.`status` = 1 
  AND `linkUserModule`.`module` IN (Query1) 
 GROUP BY `user`.`id`
  HAVING COUNT(*)=@MODULESCOUNT ;

还有可能使用'子查询'而不是变量:

SELECT `user`.`id`, 
 FROM `user` 
  JOIN `linkUserModule` ON `user`.`id` = `linkUserModule`.`user` 
 WHERE `linkUserModule`.`status` = 1 
  AND `linkUserModule`.`module` IN (Query1) 
 GROUP BY `user`.`id`
  HAVING COUNT(*)=
  (
   SELECT COUNT(*) 
   FROM `modules` 
   JOIN `linkModuleProgramm` ON `module`.`id` = `linkModuleProgramm`.`module` 
   WHERE `linkModuleProgramm`.`programm` = 1 
  )

但我不喜欢里面的子查询'其中'或者'因为这些部分,mysql有时会决定做一些不合理的低效事情。