假设我有以下两个表:
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
的原因。 最佳答案
为了使用聚合函数(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