假设我有以下两个表:

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 JOININNER 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

10-02 05:15
查看更多