2014-09-03 63 views
0

service_option表和room表具有相同的列room_keyroom表和user表共享相同的列user_key,我想是獲得從服務中選擇用戶的信息來源是什麼。如何重建這個sql查詢

SELECT user_key, user_id, user_status, user_company_name 
FROM user 
WHERE user_key 
IN (
    SELECT user_key 
    FROM room 
    WHERE room_key 
    IN (
     SELECT room_key 
     FROM service_option 
     WHERE service_option_key = 3 AND ordered_service_option_status !=0 
     ) 
    ) 

使用嵌套在另一個IN中的IN變成效率非常低。

+0

[SQL JOIN(http://www.sql-tutorial.net/SQL-JOIN.asp)。 – 2014-09-03 06:04:01

+0

我使用Mysql 5.6 – Sarotti 2014-09-03 06:05:34

回答

2

這可能是你要找的查詢:

SELECT U.user_key 
    ,U.user_id 
    ,U.user_status 
    ,U.user_company_name 
FROM [user] U 
INNER JOIN room R ON R.user_key = U.user_key 
INNER JOIN service_option S ON S.room_key = R.room_key 
           AND S.service_option_key = 3 
           AND S.ordered_service_Option_status != 0 

INNER JOIN方法將更加高性能,使查詢更具可讀性。

希望這會幫助你。

+0

它有幫助。並且在SELECT之後添加了DISTINCT – Sarotti 2014-09-03 06:38:19

2

不要使用WHERE IN,但加入:

SELECT u.user_key, u.user_id, u.user_status, u.user_company_name 
FROM user u, room r, service_option so 
WHERE u.user_key = r.user_key 
AND r.room_key = so.room_key 
AND so.service_option_key = 3 
AND so.ordered_service_option_status != 0 
1
SELECT u.user_key, u.user_id, u.user_status, u.user_company_name 
FROM 
user u join room r on u.user_key = r.user_key 
join service_option so on so.room_key = r.room_key 
WHERE 
so.service_option_key = 3 AND so.ordered_service_option_status !=0