Я работаю над созданием 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, пытаясь найти решение, но мне кажется, что я ударил стену, и мне нужен кто-то, кто поможет мне преодолеть это, чтобы продолжить понимание того, что здесь происходит.
спасибо.
Это правильно. Спасибо! В вашем ответе есть одна ошибка, которую я заметил, на 'INNER JOIN', где он говорит' uc.cid = u.uid', он должен быть 'uc.uid = u.uid'. Когда я это сделал, тогда это сработало. Еще раз спасибо! Я бы поднял ваш ответ, но у меня пока нет репутации. –
Прохладный, я исправил это. Я задавался вопросом, когда я писал запрос, но это то, как соединение работало в вашем исходном запросе (в «старой школе» вступают в предложение WHERE). Рад, что это сработало для вас в любом случае: D –
Bah! Я вижу это сейчас, я пошатнул свой первоначальный запрос! Спасибо, что указали это @Richard Hansell –