2012-12-16 137 views
1

我有一個查詢問題,你可以告訴我,我錯了嗎?
一個有3個表 用戶,users_eyes,users_eyestype那裏是:MySQL查詢左加入,並有條款

`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` (
    `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 

其結果是一個有兩種眼睛的傢伙,而不是這個有四種眼睛的傢伙 在我加入和eyes_type之前,一切都是完美的。

+0

你能告訴我們你的預期結果嗎?讓我知道你是否仍然需要一個解決方案。 :-) – bonCodigo

+0

SELECT u.id ,GROUP_CONCAT(DISTINCT ue.user_eyescolor_id SEPARATOR '')作爲eyes_color ,GROUP_CONCAT(DISTINCT uet.user_eyestype_id SEPARATOR '')作爲eyes_type FROM用戶ü LEFT JOIN users_eyes UE在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 這解決了我的問題,選擇了擁有所有眼球的人 – cNb

+0

現在唯一的問題是當我在單個查詢中加入5-6和更多表時,需要這樣做。需要很長時間才能完成我的查詢 – cNb

回答

0

這將是很好的測試數據,讓你正確。 可能需要改用COUNT(distinct ue.user_id)。

並且不需要LEFT JOIN users_eyes - 內部連接更適合用作where和having子句中的users_eyes字段。

UPDATE: 參見a fixed query

說明: 如果用戶具有例如4名users_eyes和3名users_eyestype加入後獲得12條記錄(笛卡爾積)。這就是爲什麼COUNT(ue.user_id)失敗。

解決方案: 改爲使用COUNT(user_eyescolor_id)= 4。在未來,我會建議更改查詢,但沒有簡單的解決方法。

+0

有user1誰有4行user_eyescolor_id(IN(1,3)和 user2,誰有2行user_eyescolor_id IN(1,2,3,4) 當我把我的左加入eyes_color我有我想要的結果(用戶1) ,但是當我加入並離開加入eyes_type時,reusult是user2。 我已經嘗試過內連接的結果是一樣的 – cNb

+0

你有沒有嘗試數不同? – burnall

+0

是的,我已經嘗試過但沒有結果 – cNb