Hej,
jag har problem med en SQL-fråga. Jag har två tabeller, users och events, som ser ut såhär:
mysql> DESCRIBE users;
+---------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+------------------+------+-----+---------+----------------+
| username | varchar(20) | | PRI | | |
| password | varchar(32) | | | | |
| email | varchar(40) | YES | | NULL | |
+---------------+------------------+------+-----+---------+----------------+
mysql> describe events;
+-------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-----------------------+------+-----+---------+----------------+
| id | int(10) unsigned | | PRI | NULL | auto_increment |
| username | varchar(20) | | | | |
| timestamp | timestamp(12) | YES | | NULL | |
| description | text | | | | |
+-------------+-----------------------+------+-----+---------+----------------+
Jag vill ställa en fråga som returnerar en lista över alla användare samt hur många actions de har haft idag, i veckan och totat. Jag försökte göra detta såhär:
SELECT
u.username,
COUNT(DISTINCT e1.timestamp),
COUNT(DISTINCT e2.timestamp),
COUNT(DISTINCT e3.timestamp)
FROM users AS u
LEFT OUTER JOIN events AS e1 ON u.username=e1.username
LEFT OUTER JOIN events AS e2 ON u.username=e2.username
LEFT OUTER JOIN events AS e3 ON u.username=e3.username
WHERE
(DATE_FORMAT(e1.timestamp, '%Y-%m-%d')=CURDATE() OR e1.timestamp IS NULL) AND
(YEARWEEK(e2.timestamp)=YEARWEEK(CURDATE()) OR e2.timestamp IS NULL)
GROUP BY u.username
Problemet är att de användare som har events som inte är från idag eller denna veckan inte kommer med. Jag vill alltså att alla ska komma med, fast helt enkelt med rätt COUNT.
Några SQL-gurus som vet hur jag löser detta?