2010-08-10 97 views
1

我正在嘗試編寫一個查詢來查明哪些用戶沒有註冊某些課程。在MySQL中查找缺失值

我有2個表;課程和用戶。兩者分別包含字段'id'和'coursename'和用戶名'。

使用這兩個表,現有系統將用戶添加到第三個表(稱爲enrolled_users)。用戶每佔用一行。例如,如果用戶ID「1」是在4個療程enrolled_users看起來是這樣的:

----------------------- 
| user_id | course_id | 
----------------------- 
|  1 |  1  | 
|  1 |  2  | 
|  1 |  3  | 
|  1 |  4  | 
----------------------- 

正如你可以看到這個表中的數據不是建立在一個關係,它使用的是兩個表「課程在PHP中生成'和'用戶'。

我不知道如何編寫一個關於如何找出課程的查詢用戶'1'沒有註冊,如果有說10門課程,但我們可以看到用戶'1'只在課程1- 4。

我想要使用像LIKE或不喜歡的東西嗎?

SELECT u.id, c.id, ec.user_id, ec.course_id 
FROM users u, courses c, enrolled_courses ec 
WHERE u.id = ec.user_id 
AND c.id = ec.course_id 
AND u.id = '1' 

我已經嘗試使用=和<>但是,這並不表明我需要什麼!;用戶沒有註冊的課程列表。

對不起,如果我是模糊的,試圖讓我的頭!

在現有系統上使用MySQL 5.0,我無法修改,只能從​​(目前)查詢。

+0

的想法是做左的連接,並添加其中course.id爲空 – 2010-08-10 11:51:52

回答

5
SELECT 
    * 
FROM 
    courses c 
WHERE 
    c.id NOT IN (
    SELECT 
     ec.course_id 
    FROM 
     enrolled_courses ec 
    WHERE 
     ec.user_id = 1 AND ec.course_id IS NOT NULL 
    ) 
+0

謝謝,這是完美的 – Mathnode 2010-08-10 13:03:17

0

只要使用一個不在和子選擇。

select * from courses c where c.id not in 
    (select course_id from enrolled_courses where user_id='1') 
+0

寫的概念,但用戶表中沒有一門課程的ID ......這是什麼enrolled_courses是爲 – DRapp 2010-08-10 11:56:13

+0

難道不是如果你在參加的課程中替代,這是否一樣? – Nix 2010-08-10 12:04:32

+0

乾杯尼克斯,它做到了: 'SELECT * from courses c WHERE c.id NOT IN (SELECT course_id from enrolled_courses WHERE user_id ='1')' – Mathnode 2010-08-10 13:02:56

0

如果你正在尋找一個特定的單一用戶ID,一定要包括該ID的條件作爲WHERE子句的一部分,否則,將其留空,它會給你們誰也註冊了所有的人所有可能的類都通過笛卡爾產品(因爲用戶和課程表之間沒有直接聯繫)..如果試圖爲所有人運行,這可能非常大/耗時,而您的課程表是100人的課程,其中有人只參與2 -3-4課程。

select 
     u.id, 
     c.id CourseID 
    from 
     users u, 
     courses c 
    where 
      u.id = 1 
     AND c.id NOT IN 
      (select ec.Course_ID 
       from enrolled_courses ec 
       where ec.user_id = u.id)