带有Left Join和having子句的MySQL Query

时间:2012-12-16 10:32:22

标签: mysql sql select

我有查询问题你能告诉我哪里错了吗?
我有3张桌子:

  

用户:

 `users` (
  `id` int(11)  AUTO_INCREMENT,
  `first_name` varchar(16),
  `last_name` varchar(16) 
  `email` varchar(16)
  `password` varchar(32)
  `phone` varchar(13)
  `age` tinyint(4)
  `gender` varchar(6) 
  )


  

users_eyes:

  `users_eyes` (
  `user_id` int(4),
  `user_eyescolor_id` tinyint(2),
  UNIQUE KEY `user_id` (`user_id`,`user_eyescolor_id`)
) 


  

users_eyestype:

  `users_eyestype` (
  `user_id` int(4),
  `user_eyestype_id` tinyint(2),
  UNIQUE KEY `user_id` (`user_id`,`user_eyestype_id`)
) 


这是我的查询

SELECT 
                        SQL_CALC_FOUND_ROWS
                        u.first_name, 
                        u.last_name,
                        u.age,
                        u.gender,
                        u.phone,
                        u.id
, GROUP_CONCAT(DISTINCT ue.user_eyescolor_id SEPARATOR  ' ' ) as eyes_color 
, GROUP_CONCAT(DISTINCT uet.user_eyestype_id SEPARATOR  ' ' ) as eyes_type
FROM users u
LEFT JOIN users_eyes ue ON u.id = ue.user_id
LEFT JOIN users_eyestype uet ON u.id = uet.user_id
WHERE
ue.user_eyescolor_id IN (1,2,3,4)
GROUP BY u.id
HAVING
COUNT(ue.user_id) = 4

结果是一个有2种眼睛的男人,而不是这种有4种眼睛的男人 在加入和eyes_type之前,一切都很完美。

1 个答案:

答案 0 :(得分:0)

让测试数据正确使用会很不错。 可能你需要COUNT(不同的ue.user_id)。

并且不需要LEFT JOIN users_eyes - 内部联接更适合在where和having子句中使用的users_eyes字段。

<强>更新: 见a fixed query

<强>说明: 如果用户有例如加入后4个users_eyes和3个users_eyestype他/她获得12条记录(笛卡尔积)。这就是 COUNT(ue.user_id)失败的原因。

<强>解: 请改用COUNT(user_eyescolor_id)= 4。在将来,我会建议更改查询,但没有简单的解决方法。