2015-10-06 655 views
1

假設我有以下兩個表:使用SQL LEFT JOIN和MAX()和MIN()函數

CREATE TABLE users (
    id MEDIUMINT NOT NULL AUTO_INCREMENT, 
    name CHAR(30) NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE=MyISAM; 

CREATE TABLE logins (
    user_id NOT NULL, 
    day DATE NOT NULL, 
    PRIMARY KEY (`user_id, `day`) 
) ENGINE=MyISAM; 

我想在這裏做的就是查詢與所有用戶第一天,他們登錄,他們中的查詢記錄的最後一天,我正在執行實現這一目標如下所示:

SELECT u.id AS id, u.name AS name, MIN(l.day) AS first_login, 
    MAX(l.day) AS last_login 
FROM users u 
LEFT JOIN logins l ON u.id = l.user_id 

的問題是,因爲使用的MIN()MAX()的,我只在整個結果中返回一行。我確定這是我使用這些導致這個功能的功能。即使他們沒有任何登錄項,我也應該爲每個用戶設置一行。這是我使用LEFT JOIN而不是INNER JOIN的原因。

+0

'GROUP BY u.id'? – CollinD

回答

1

爲了使用聚合函數(min,max,...),您需要分組。嘗試是這樣的:

SELECT u.id AS id, u.name AS name, MIN(l.day) AS first_login, MAX(l.day) AS last_login 
FROM users u 
LEFT JOIN logins l ON u.id = l.user_id 
GROUP BY u.id 
0

MIN和MAX是集合函數。

您應該使用GROUP BYu的某些字段,如id

1

除了MySQL的任何明智的數據庫就會給你混行的條款和條件彙總,使得誤差更清晰的錯誤。 MySQL的,不幸的是允許這種行爲,使其更難發現,你忘了每個用戶生成一行所需要的group by條款:

SELECT u.id AS id, 
      u.name AS name, 
      MIN(l.day) AS first_login, 
      MAX(l.day) AS last_login 
FROM  users u 
LEFT JOIN logins l ON u.id = l.user_id 
GROUP BY u.id, u.name -- missing in the original query 
0

分組是資源的浪費。 改爲使用嵌套的select語句。 例如。

`SELECT u.id AS id, 
     u.name AS name, 
     (select max(logins.day) from logins where logins.user_id=u.id) as last_login 
from users u; '