2012-01-11 72 views
2

是否可以將以下子查詢轉換爲JOIN,最好是沒有派生表?將子查詢轉換爲加入

SELECT * FROM users u 
LEFT JOIN user_groups ug ON u.usergroupid=ug.groupid 
WHERE 
u.userstatus=1 AND 
ug.groupstatus=1 AND 
ug.grouprank>=(SELECT grouprank FROM user_groups WHERE groupkey='users') 

的user_groups表如下所示:

+-------------+---------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+---------------------+------+-----+---------+----------------+ 
| groupid  | tinyint(3) unsigned | NO | PRI | NULL | auto_increment | 
| groupkey | varchar(8)   | NO |  | NULL |    | 
| grouprank | smallint(6)   | NO |  | NULL |    | 
| groupstatus | tinyint(1) unsigned | NO |  | NULL |    | 
+-------------+---------------------+------+-----+---------+----------------+ 

的用戶表看起來像:

+--------------+---------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+---------------------+------+-----+---------+----------------+ 
| userid  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| username  | varchar(32)   | NO |  | NULL |    | 
| userpassword | varchar(32)   | NO |  | NULL |    | 
| usergroupid | tinyint(3) unsigned | NO |  | NULL |    | 
| userstatus | tinyint(1) unsigned | NO |  | NULL |    | 
+--------------+---------------------+------+-----+---------+----------------+ 
+1

請編輯您的問題來描述有問題的表,或至少'user_groups'表。 – 2012-01-11 00:27:23

+0

我已將兩個表都添加到說明中。 – Simon 2012-01-11 00:32:41

+1

爲什麼'LEFT JOIN user_groups'然後在'WHERE'子句中檢查'ug.groupstatus = 1'? – 2012-01-11 00:36:51

回答

1

我認爲這是你在找什麼 - 給它一個測試。

SELECT * FROM users u 
LEFT JOIN user_groups ug ON u.usergroupid=ug.groupid 
JOIN user_groups ug2 ON ug.grouprank >= ug2.grouprank AND ug2.groupkey = 'users' 
WHERE 
u.userstatus=1 AND 
ug.groupstatus=1 
+0

是的。這工作完美。謝謝! :) – Simon 2012-01-11 00:42:40

+0

注意:ruakh的答案還會進一步改進您的查詢。值得閱讀他的答案,以瞭解如何改善您的查詢甚至比您提出的要好。 – ean5533 2012-01-11 00:43:37

+0

我同意。兩者都非常相似,都有效,但我已經接受你的答案,因爲你先回答。 – Simon 2012-01-11 00:46:04

2

假設只有一個user_groups記錄具有groupkey = 'users'(否則您的查詢是無效的),您的查詢是相同的:

SELECT u.*, 
     ug1.* 
    FROM users u 
    LEFT 
    JOIN user_groups ug1 
    ON u.usergroupid = ug1.groupid 
    LEFT 
    JOIN user_groups ug2 
    ON ug2.groupkey = 'users' -- not a real join condition 
WHERE u.userstatus = 1 
    AND ug1.groupstatus = 1 
    AND ug1.grouprank >= ug2.grouprank 
; 

但是注意,LEFT JOIN 5事實上最終工作作爲INNER JOIN s,因爲您的WHERE子句取決於成功的連接。所以你可能真的想要這樣的事情:

SELECT u.*, 
     ug1.* 
    FROM users u 
    LEFT 
    JOIN user_groups ug1 
    ON u.usergroupid = ug1.groupid 
    AND ug1.groupstatus = 1 
    LEFT 
    JOIN user_groups ug2 
    ON ug2.groupkey = 'users' 
    AND ug1.grouprank >= ug2.grouprank 
WHERE u.userstatus = 1 
; 
+0

是的,groupkey檢查唯一性,所以總是隻有1個值。你的查詢也可以。謝謝 :) – Simon 2012-01-11 00:44:26