1

クエリに問題があります。どこが間違っているか教えてもらえますか?
私は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` (
  `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 する前は、すべてが完璧です。

4

1 に答える 1

0

正しく取得するためのテスト データがあると便利です。おそらく、代わりに COUNT(distinct ue.user_id) が必要です。

また、LEFT JOIN users_eyes は必要ありません。users_eyes フィールドが where 句と having 句で使用されるため、内部結合の方が適しています。

UPDATE :固定クエリを見る

説明: たとえば、ユーザーが参加後に 4 つの users_eyes と 3 つの users_eyestype を持っている場合、そのユーザーは 12 レコード (デカルト積) を取得します。これがCOUNT(ue.user_id)が失敗した理由です。

解決策 : 代わりに COUNT(user_eyescolor_id) = 4 を使用してください。簡単な回避策はありませんが、将来的にはクエリを変更することをお勧めします。

于 2012-12-16T11:50:28.987 に答える