2012-01-17 65 views
1

我有如下兩個MySQL表:如何用LEFT JOIN修復這個SQL?

mysql> desc subscriptions; 
+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(6)  | NO | PRI | NULL | auto_increment | 
| id_user | int(6)  | NO | MUL | NULL |    | 
| id_package | int(4)  | NO |  | NULL |    | 
| expiry  | date   | YES |  | NULL |    | 
| ip   | varchar(100) | NO |  | NULL |    | 
| amount  | double  | NO |  | NULL |    | 
| processed | tinyint(4) | NO |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 
7 rows in set (0.00 sec) 


mysql> desc packages; 
+----------+--------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+----------+--------------+------+-----+---------+----------------+ 
| id  | int(6)  | NO | PRI | NULL | auto_increment | 
| id_panel | tinyint(4) | NO |  | NULL |    | 
| name  | varchar(100) | NO |  | NULL |    | 
| price | double  | NO |  | NULL |    | 
| period | varchar(50) | NO |  | NULL |    | 
| days  | int(11)  | NO |  | NULL |    | 
| visible | tinyint(4) | NO |  | NULL |    | 
| payment | tinyint(4) | NO |  | 1  |    | 
+----------+--------------+------+-----+---------+----------------+ 
8 rows in set (0.00 sec) 

我使用的後續查詢以檢索所有的包和相關用戶過期日期(具體包)。

SELECT packages.id, packages.name, packages.price, packages.period, packages.days, MAX(subscriptions.expiry) as expiry 
FROM packages LEFT JOIN subscriptions 
ON subscriptions.id_package = packages.id AND subscriptions.processed = 1 AND subscriptions.id_user = 1 
WHERE packages.visible = 1 
GROUP BY subscriptions.id_user 
ORDER BY packages.id_panel 

我的問題是,如果沒有訂閱特定的包,查詢不會顯示包。

我必須表現出所有的頁面和....如果用戶已經訂閱檢查MAX到期日(becase的我跟蹤所有用戶所做的subscrions)。

我該怎麼讓所有的包和相關用戶的到期日期? (如果沒有訂閱包顯示NULL)

回答

1

您正在按subscriptions.id_user進行分組,但您從packages表中選擇了所有非聚集。你確定你是按正確的字段分組嗎?

它看起來應該是packages.id ...

+0

是不正確的,正確的.... packages.id – Dail 2012-01-17 12:25:24

+0

@Dail - 偉大的,有在GROUP BY不同領域確實現在你的查詢工作? :) – MatBailie 2012-01-17 12:28:06

+0

是的,它完美的作品 – Dail 2012-01-17 12:29:01

0

容易...只需移動packages.visible = 1條件爲ON條款!

SELECT packages.id, packages.name, packages.price, packages.period, packages.days, MAX(subscriptions.expiry) as expiry 
FROM packages 
LEFT JOIN subscriptions ON subscriptions.id_package = packages.id 
    AND subscriptions.processed = 1 
    AND subscriptions.id_user = 1 
    AND packages.visible = 1 
GROUP BY 1,2,3,4,5 
ORDER BY packages.id_panel 

這種做法是唯一方式來獲得條件爲LEFT JOIN,和一個偉大的伎倆要記住。

注意:您GROUP BY列表太

+0

我認爲這是不正確的。由於packages表位於連接的左側,因此在where子句中使用'packages.visible'引用不成問題。此外,建議的SQL現在顯示所有包,即使它們不可見,但只是不加入對不可見包的訂閱。 * [我認爲這只是GROUP BY,那是錯誤的。因爲它是MySQL,你只需要GROUP BY唯一標識符,而不是package表中的每個字段。] * – MatBailie 2012-01-17 12:21:55