PHP中的复杂MySql查询

时间:2014-04-29 21:18:27

标签: php mysql sql

我有这些表格:

  • 考试(体检)
  • 用户
  • 机构(医疗机构)
  • users_institutions(联接表)
  • log(这里我保留登录,退出,下载文件的日期和时间)

用户属于一个或多个机构,考试仅属于一个机构。因此,用户只能搜索属于其机构的考试的考试表。我用来获取此信息的查询如下:

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个用户,我需要每个用户都有自己的结果集。

谢谢!

(抱歉我的英语不好)

1 个答案:

答案 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个错误,因为你要弄清楚这个问题。我不认为这样可以帮助你。