2014-08-21 1 views
0

Я работаю над созданием query, где я вижу, что некоторые пользователи прошли курс, и если у них есть , какой курс они взяли.MySQL - поиск, если пользователь взял курс, и если да, то какой из них генерируется слишком много строк.

Существуют три таблицы, которые я использую для получения этой информации.

Первая таблица называется users и является:

Users: 
    uid INTEGER PRIMARY KEY, 
    name VARCHAR, 
    email VARCHAR 

Вторая таблица courses и является:

Courses: 
    cid INTEGER PRIMARY KEY, 
    name VARCHAR, 
    starts DATETIME, 
    ends DATETIME 

Третья таблица UserCourses и является:

UserCourses: 
    cid INTEGER, 
    uid INTEGER, 
    PRIMARY KEY(cid,uid), 
    FOREIGN KEY(cid) REFERENCES Courses (cid), 
    FOREIGN KEY(uid) REFERENCES Users (uid) 

ПРИМЕЧАНИЕ: Есть еще много полей в таблице User и Courses, я перечисляю только те релевантные. Я работаю с данной базой данных, поэтому я не могу вносить какие-либо изменения в какие-либо таблицы.

В настоящее время существует только два разных курса, которые преподаются, но поскольку каждый курс обучается между определенным периодом времени (интервал 8 недель), строка создается каждый раз, когда курс добавляется к системы и, таким образом, с учетом уникального cid.

Не было никакого соглашения об именовании того, что называются этими курсами, но курсы обычно называются Course I и Course II. Но иногда эти курсы называются Course 1 и Course 2 соответственно.

Что я пытаюсь сделать, так это то, что я пытаюсь проверить, было ли users принято courses, и если да, то какой курс. Мне не нужно название курса, только если они взяли Course I или Course II, всего лишь 'Yes','No' или просто Boolean 0 or 1.

SQL, я сделал, чтобы попытаться решить это:

SELECT 
    u.uid, 
    IF(c1.name REGEXP 'Course I?$ | Course I[[:space:]] | Course 1','Yes','No') as 'Course 1', 
    IF(c2.name REGEXP 'Course II$ | Course II[[:space:]] | Course 2','Yes','No') as 'Course 2' 

FROM 
    Users u, 
    UserCourses uc 

LEFT JOIN Courses c1 
    ON uc.cid = c1.cid 

LEFT JOIN Courses c2 
    ON uc.cid = c2.cid 

#WHERE u.uid = uc.cid /This was edited out, @Richard spotted this error, see his answer 
WHERE u.uid = uc.uid 

ORDER BY u.uid 
; 

И когда я запускаю это я получаю каждый пользователь и посмотреть, если он взят конкретный курс или нет. Но если пользователь был зачислен в курсы несколько раз (но в каждом курсе с разными cid), то я получаю новую строку для каждой регистрации пользователя.

То, что я пытаюсь достичь просто получить Yes или No для столбцов Course 1 и Course 2. Мне не нужно знать, взяли ли они несколько курсов на одном уровне (например, один и тот же пользователь принимал Course I три раза), мне просто нужно знать, взяли ли они Course 1 или нет.

Я пробовал использовать GROUP BY u.uid, но он меняет поля в столбцах Course 1 и Course 2.

Любая информация или продукт в правильном направлении были бы очень признательны.

Я изливал SQL, пытаясь найти решение, но мне кажется, что я ударил стену, и мне нужен кто-то, кто поможет мне преодолеть это, чтобы продолжить понимание того, что здесь происходит.

спасибо.

ответ

0

Что-то в этом роде?

SELECT 
    u.uid, 
    MAX(IF(c.name REGEXP 'Course I?$ | Course I[[:space:]] | Course 1', 1, 0)) AS 'Course 1', 
    MAX(IF(c.name REGEXP 'Course II$ | Course II[[:space:]] | Course 2', 1, 0)) AS 'Course 2' 
FROM 
    Users u 
    INNER JOIN UserCourses uc ON uc.uid = u.uid 
    LEFT JOIN Courses c ON c.cid = uc.cid 
GROUP BY 
    u.uid 
ORDER BY 
    u.uid; 
+0

Это правильно. Спасибо! В вашем ответе есть одна ошибка, которую я заметил, на 'INNER JOIN', где он говорит' uc.cid = u.uid', он должен быть 'uc.uid = u.uid'. Когда я это сделал, тогда это сработало. Еще раз спасибо! Я бы поднял ваш ответ, но у меня пока нет репутации. –

+0

Прохладный, я исправил это. Я задавался вопросом, когда я писал запрос, но это то, как соединение работало в вашем исходном запросе (в «старой школе» вступают в предложение WHERE). Рад, что это сработало для вас в любом случае: D –

+0

Bah! Я вижу это сейчас, я пошатнул свой первоначальный запрос! Спасибо, что указали это @Richard Hansell –

Смежные вопросы