繁体   English   中英

PHP中的复杂MySql查询

[英]Complex MySql Query in PHP

我有这些表:

  • 考试(医学考试)
  • 使用者
  • 机构(医疗机构)
  • users_institutions(联接表)
  • 日志(这里我保留登录,注销,下载文件的日期和时间)

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM