PHP中的复杂MySql查询

PHP中的复杂MySql查询,php,mysql,sql,Php,Mysql,Sql,我有这些桌子: 考试(医学考试) 使用者 机构(医疗机构) 用户和机构(联接表) 日志(我在这里保存登录、注销和下载文件的日期和时间) 用户属于一个或多个机构,考试只属于一个机构。所以,用户只能在考试表中搜索属于他们机构的考试。我用于获取此信息的查询如下: SELECT * FROM exams, institutions, users_institutions WHERE institutions.institution_pk = users_institutions.instituti

我有这些桌子:

  • 考试(医学考试)
  • 使用者
  • 机构(医疗机构)
  • 用户和机构(联接表)
  • 日志(我在这里保存登录、注销和下载文件的日期和时间)
用户属于一个或多个机构,考试只属于一个机构。所以,用户只能在考试表中搜索属于他们机构的考试。我用于获取此信息的查询如下:

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\u id
。不要叫它
user\u 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\u pk IS NULL
退出尚未下载的考试(如果没有下载的日志条目,左连接将失败并在该列中放置NULL)

如果只需要一个用户的结果集,请将
和u.users\u pk=something
附加到此查询


这是没有调试。你可能会得到一堆1064的错误,因为你摆弄弄弄这个工作。我认为这样做无法帮助您解决这些问题。

专业提示:永远不要在软件中使用
SELECT*
。而是枚举结果集中所需的列。首先,它使服务器更快。另一方面,它使下一个人更容易理解查询的目的

专业提示:不要使用老式的逗号分隔表列表进行连接。使用连接

专业提示:不要以为这很复杂就挂断电话。其实很简单

专业提示:尝试对每个表中相同类型的值使用相同的列名。换句话说,在提到的所有表中调用用户id
user\u id
。不要叫它
user\u 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\u pk IS NULL
退出尚未下载的考试(如果没有下载的日志条目,左连接将失败并在该列中放置NULL)

如果只需要一个用户的结果集,请将
和u.users\u pk=something
附加到此查询


这是没有调试。你可能会得到一堆1064的错误,因为你摆弄弄弄这个工作。我认为这样做无法帮助您解决这些问题。

专业提示:永远不要在软件中使用
SELECT*
。而是枚举结果集中所需的列。首先,它使服务器更快。另一方面,它使下一个人更容易理解查询的目的

专业提示:不要使用老式的逗号分隔表列表进行连接。使用连接

专业提示:不要以为这很复杂就挂断电话。其实很简单

专业提示:尝试对每个表中相同类型的值使用相同的列名。换句话说,在提到的所有表中调用用户id
user\u id
。不要叫它
user\u 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\u pk IS NULL
退出尚未下载的考试(如果没有下载的日志条目,左连接将失败并在该列中放置NULL)

如果只需要一个用户的结果集,请将
和u.users\u pk=something
附加到此查询


这是没有调试。你可能会得到一堆1064的错误,因为你摆弄弄弄这个工作。我认为这样做无法帮助您解决这些问题。

专业提示:永远不要在软件中使用
SELECT*
。而是枚举结果集中所需的列。首先,它使服务器更快。另一方面,它使下一个人更容易理解查询的目的

专业提示:不要使用老式的逗号分隔表列表进行连接。使用连接

专业提示:不要以为这很复杂就挂断电话。其实很简单

专业提示:尝试对每个表中相同类型的值使用相同的列名。换句话说,在提到的所有表中调用用户id
user\u id
。不要叫它
user\u 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\u pk IS NULL
退出尚未下载的考试(如果没有下载的日志条目,左连接将失败并在该列中放置NULL)

如果你需要结果