我有这些表格:
用户属于一个或多个机构,考试仅属于一个机构。因此,用户只能搜索属于其机构的考试的考试表。我用来获取此信息的查询如下:
SELECT * FROM exams, institutions, users_institutions
WHERE institutions.institution_pk = users_institutions.institution_fk
AND exams.institution_fk = institution.institution_pk
AND users.users_pk = {$user_id}
此代码工作正常。我的问题是:
当用户从考试中下载PDF文件时,我会保存日期,时间,用户ID,考试ID,日志类型(1代表下载,2代表登录,3代表退出)。我需要一个SQL查询来搜索尚未下载的所有考试,并且属于特定用户的机构。 这意味着如果一个机构中有10个用户,我需要每个用户都有自己的结果集。
谢谢!
(抱歉我的英语不好)
答案 0 :(得分:3)
专业提示:切勿在软件中使用SELECT *
。而是枚举结果集中所需的列。首先,它使服务器更快。另一方面,它使下一个人更容易理解您的查询的目的。
专业提示:请勿使用旧的以逗号分隔的表格列表进行连接。使用连接。
专业提示:不要挂断,认为这很复杂。它实际上非常简单。
专业提示:尝试在每个表中为相同类型的值使用相同的列名。换句话说,在提到它的所有表中调用用户的id user_id
。不要将其称为user_fk
或其他内容。
我想你想要一个这样的查询:
SELECT u.users_pk, i.institution_pk, exams.id, whatever, whatever
FROM users AS u
JOIN user_institutions AS ui ON u.users_pk = ui.user_fk
JOIN institutions AS i ON us.institution_fk = i.institution_pk
JOIN exams AS e ON e.institution_fk = i.institution_pk
LEFT JOIN log AS l ON u.users_pk = l.users_fk
AND e.exam_pk = l.exam_pk
AND l.logtype = 1
WHERE l.exam_pk IS NULL
您将所有这些内容加在一起,为每个用户/机构/考试/下载日志项目获取一行。然后你使用l.exam_pk IS NULL
来取出尚未下载的考试(当没有下载的日志条目时,LEFT JOIN将失败并在该列中放置一个NULL)。
如果您只需要一个用户的结果集,请将AND u.users_pk = something
附加到此查询。
这未经过调试。你可能会得到一堆1064个错误,因为你要弄清楚这个问题。我不认为这样可以帮助你。