[英]Complex MySql Query in PHP
我有这些表:
用户属于一个或多个机构,考试仅属于一个机构。 因此,用户只能在考试表中搜索属于其机构的考试。 我用来获取此查询如下:
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位用户,我需要每个用户都有自己的结果集。
谢谢!
(对不起,我英语不好)
专家提示:切勿在软件中使用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错误。 我认为SO无法帮助您解决这些问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.