2015-07-03 22 views
2

我在查詢中掙扎了一下,希望你能幫上忙。 我有兩張桌子。與所有用戶和來自提交表單的信息一起提供。 兩者都包含用戶標識。 我需要知道的是users表中的哪個用戶沒有出現在報表上。MySQL:查找沒有提交的用戶

這是我到目前爲止有:

SELECT u.ID, u.display_name, u.user_email, r.user_id 
FROM users AS u 
LEFT JOIN report AS r ON u.ID = r.user_id 
WHERE NOT EXISTS(
    SELECT * 
    FROM report AS rr 
    WHERE u.ID = rr.user_id 
) 

這似乎是罰款誰絕對從來沒有提交表單的用戶。 但報表中還包含一個日期列,我想知道如何在一天之內分組。 在前端,然後我會希望有一個表,其中顯示:

date: user: 
2015-01-01 user a 
2015-01-01 user f 
2015-01-02 user g 
2015-01-02 user a 
2015-01-03 user z 
2015-01-03 user x 

當用戶是那些誰沒有提交表單的那一天。

希望你能幫上忙。預先感謝!

+1

你的意思是你想日期明智的用戶列表誰不存在報告表? –

+0

如何從沒有報告的用戶的報告表中獲取日期?你的問題沒有意義。 –

+0

@GordonLinoff,這就是爲什麼我想知道如果我必須改變表格,使之成爲可能。但作爲Emipro Technologies Pvt。我想知道是否有辦法查詢報表中存在的所有日期,然後查找用戶表中沒有日期/用戶標識組合的用戶。 – Marcel

回答

1

LEFT OUTER JOIN與where子句...

這裏是一個很好的鏈接...

http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

SELECT * FROM `users` 
LEFT OUTER JOIN `report` 
ON `users`.`ID` = `report`.`user_id` 
WHERE `report`.`user_id` IS null 
ORDER BY `report`.`Date` 
+0

不能解決操作問題。他希望它能按日期過濾。您可以編輯您的答案以包含該答案。 –

+0

@AlanFrancis那樣?只是一個順序,因爲在他提供的例子中,group by不起作用。 –

+0

是的,那會工作。 –

0

當然,你可以只通過在你想檢查的日期?

所以這樣的事情(使用@reportDate作爲參數):

SELECT * FROM users 
LEFT OUTER JOIN report 
ON users.ID = report.user_id 
WHERE report.user_id IS NULL 
AND report.Date = @reportDate 
2

如果你想獲得用戶的列表,並沒有在報告表中的任何行,那麼你可以生成一組是用戶的笛卡爾積和報表中存在的日期,然後用該集進行左連接並檢查爲空。

由交叉連接形成的笛卡爾集將包含日期和用戶的所有可能的組合;報表將包含的就是所有用戶都添加了關於所有可用日期的報表。

select r.date, u.user_id 
from report r 
cross join users u 
left join (select r.date, r.user_id from users as u join report as r on u.id = r.user_id) 
a on a.date = r.date and a.user_id = u.user_id 
where a.date is null 

Sample SQL Fiddle

與大多數其他數據庫,這可能已經與一組差分算完成(減去或除外)而不是左連接。

0

您可以獲取沒有報告的用戶/日期對。使用cross join生成所有可能的行,然後篩選出存在的:

select u.*, r.date 
from users u cross join 
    (select distinct date from reports r) d left join 
    reports r 
    on u.id = r.user_id and d.date = r.date 
where r.userid is null; 
2

我正在做關於列名的假設在報告表這樣的回答:

SELECT x.report_date, u.user_id, u.display_name 
FROM users u 
JOIN (
    SELECT DISTINCT report_date 
    FROM reports 
) x 
LEFT JOIN reports r 
    ON r.user_id = u.user_id 
    AND r.report_date = x.report_date 
WHERE r.report_date IS NULL 
ORDER BY x.report_date, u.user_id 

看看這個小提琴:http://sqlfiddle.com/#!9/407ac/5

+0

你讓我的一天...! – Marcel

+0

這很好。我可以添加報表中的其他列嗎?或者由於日期的不同選擇而無法實現? – Marcel

+0

您無法從報表中選擇其他列,因爲您正在查找該表中沒有記錄的實例。 SELECT DISTINCT僅用於獲取可能的日期列表。這種方法的缺點是,如果有一個日期沒有人報告,那麼這個日期根本就不會在結果中出現。 – bobwienholt