Reputation: 1
I'm making a simple application about the daily assessment test of employees in the office.
The application stores the score results of several daily questions in the database, daily questions are inputted every day.
I have 2 tables in my MySQL Database, there is:
This is account_table :
accountID | accountName | accountEmail
1 | John | [email protected]
2 | Derick | [email protected]
3 | Ratna | [email protected]
And this is assessment_table: (for example today is 2020-10-08)
assessmentID | accountID | assessmentScore | assessmentDate
1 | 1 | 50 | 2020-10-07
2 | 2 | 75 | 2020-10-07
3 | 3 | 93 | 2020-10-07
4 | 2 | 47 | 2020-10-08
5 | 3 | 80 | 2020-10-08
How can I see accounts that haven't done an assessment today?
Thank you for your help, Regards.
Upvotes: 0
Views: 159
Reputation: 5871
By using the below command if some extra entries present in the assessment_table which do not have an entry in the account table will be rejected.
SELECT * FROM account_table
WHERE accountID NOT IN
(SELECT assessment_table.accountID FROM assessment_table
RIGHT JOIN account_table on account_table.accountID = assessment_table.accountID
WHERE assessment_table.assessmentDate = DATE(NOW()))
Upvotes: 0
Reputation: 342
SELECT * FROM account_table WHERE account_table.accountID NOT IN (
SELECT accounts.accountID
FROM assessment_table assessments
INNER JOIN account_table accounts ON assessments.accountID = accounts.accountID
WHERE assessments.assessmentDate = "2020-10-08"
)
Upvotes: 1
Reputation: 42632
SELECT act.*
FROM account_table act
LEFT JOIN assessment_table ast ON act.accountID = ast.accountID
AND ast.assessmentDate = '2020-10-08'
WHERE ast.accountID IS NULL
or
SELECT *
FROM account_table act
WHERE NOT EXISTS ( SELECT NULL
FROM assessment_table ast
WHERE act.accountID = ast.accountID
AND ast.assessmentDate = '2020-10-08' )
You may use CURRENT_DATE
instead of '2020-10-08'
literal for to receive the output for current day always.
PS. I do not show WHERE NOT IN
variant - it is slower in almost all cases.
Upvotes: 3
Reputation: 1068
I think the simplest way would be something like this:
SELECT * FROM account_table
WHERE accountID NOT IN (SELECT accountID FROM assessment_table WHERE assessmentDate = DATE(NOW()));
Upvotes: 0
Reputation: 127
Just
SELECT ac_t.* FROM `account_table` ac_t
INNER JOIN `assessment_table` as_t
ON ac_t.accountID = as_t.accountID
WHERE as_t.accountID NOT IN (
SELECT accountID FROM assessment_table WHERE `assessmentDate` = '2020-10-08'
)
If you want today not hardcoded
SELECT ac_t.* FROM `account_table` ac_t
INNER JOIN `assessment_table` as_t
ON ac_t.accountID = as_t.accountID
WHERE as_t.accountID NOT IN (
SELECT accountID FROM assessment_table WHERE `assessmentDate` = CURDATE()
)
Upvotes: 0
Reputation: 1
This sql statement should work
SELECT account_table.accountID
FROM account_table
WHERE account_table.accountID NOT IN
(SELECT assessment_table.accountID
FROM assessment_table
WHERE CAST(assessmentDate AS DATE) = CAST("2020-10-08" AS DATE))
"2020-10-08" you could use functions like NOW() to get all entries of today
Upvotes: 0
Reputation: 117
hi Please use this sql statement
$today = date("d");
$month = date('m');
$year = date('Y');
$query = "SELECT * FROM account_table as account inner join assessment_table as on account.accountID=assesment.accountId where DAY(assesment.assessmentDate) = $today AND MONTH(assesment.assessmentDate) = $month AND YEAR(assesment.assessmentDate) = $year";
Upvotes: -2