我该如何构造这个MySQL查询?

时间:2014-02-15 22:34:00

标签: mysql sql database

我有一个包含四个表的数据库:

users
- id
- name

sessions
- id
- title

sessions_users
- id
- sessions_id
- users_id

session_feedback
- id
- sessions_id
- users_id

用户被设置为参加某些会话(通过将他们的ID添加到sessions_users表)。用户还应该在会话上留下反馈。完成后,会话的ID(sessions_id)和退出反馈的用户的ID(users_id)将输入session_feedback表。

鉴于特定用户的ID,我无法弄清楚如何选择尚未收到反馈的会话(即session_feedback中没有包含sessions_id的条目1}}和users_id)。即我需要选择所有有待反馈的会话。

任何人都可以提供帮助吗?

2 个答案:

答案 0 :(得分:2)

这是你想要的吗?这将返回尚未收到反馈的所有会话ID和标题。

    select sessions.id, sessions.title
    from sessions where sessions.id NOT IN 
        (select sessions_id from session_feedback)

对于特定用户:

    SELECT sessions.id, sessions.title
    FROM sessions INNER JOIN sessions_user on
        sessions.id = sessions_user.sessions_id
    WHERE sessions.id NOT IN (select sessions_id from session_feedback)
    AND sessions_user.users_id = [given user id]

答案 1 :(得分:1)

你可以通过LEFT join来实现。

SELECT s.* FROM sessions s
LEFT JOIN session_feedback sf ON sf.sessions_id = s.id
WHERE sf.session_id IS NULL

查询只检索来自sessions表的所有记录,其中没有指向feedback表的链接(从而为您提供没有反馈的会话)。如果您想要包含那些没有反馈的用户的会话。

SELECT s.* FROM sessions s
INNER JOIN sessions_users su ON su.sessions_id = su.id
INNER JOIN users u ON su.user_id = u.id
LEFT JOIN session_feedback sf ON sf.users_id = u.id
WHERE sf.session_id IS NULL

要进一步改进或收紧查询,只需添加WHERE子句。