【问题标题】:MySQL Query with Left Join and having clause带有左连接和有子句的 MySQL 查询
【发布时间】:2012-12-03 17:42:25
【问题描述】:

我的查询有问题,你能告诉我哪里错了吗?
我有 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之前,一切都刚刚好。

【问题讨论】:

  • 你能告诉我们你的预期结果吗?如果您仍然需要解决方案,请告诉我。 :-)
  • SELECT 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(DISTINCT ue.user_eyescolor_id) = 4 那解决了我的问题,选择拥有所有眼睛颜色的人
  • 现在唯一的问题是当我在一个查询中加入 5-6 个和更多表时,需要这样做。完成我的查询需要很长时间

标签: mysql sql select


【解决方案1】:

如果有测试数据可以帮助您正确解决问题,那就太好了。 可能您需要 COUNT(distinct 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。将来我会建议更改查询,但没有简单的解决方法。

【讨论】:

  • 有 user1 有 4 行 user_eyescolor_id (IN(1,3) 和 user2 有 2 行 user_eyescolor_id IN (1,2,3,4) 当我把我的左连接 eye_color 我有我想要的结果(user1)但是当我添加并左连接eyes_type时,结果是user2。我尝试过内部连接,结果是一样的
  • 结果是一样的。我想向用户展示 ue.user_eyescolor_id IN (1,2,3,4) 但所有这些。在具体情况下,结果是用户 ue.user_eyescolor_id IN (1,3)
  • 我现在明白了,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
相关资源
最近更新 更多