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*
。而是枚举结果集中所需的列。首先,它使服务器更快。另一方面,它使下一个人更容易理解查询的目的
专业提示:不要使用老式的逗号分隔表列表进行连接。使用连接
专业提示:不要以为这很复杂就挂断电话。其实很简单
专业提示:尝试对每个表中相同类型的值使用相同的列名。换句话说,在提到的所有表中调用用户iduser\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*
。而是枚举结果集中所需的列。首先,它使服务器更快。另一方面,它使下一个人更容易理解查询的目的
专业提示:不要使用老式的逗号分隔表列表进行连接。使用连接
专业提示:不要以为这很复杂就挂断电话。其实很简单
专业提示:尝试对每个表中相同类型的值使用相同的列名。换句话说,在提到的所有表中调用用户iduser\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*
。而是枚举结果集中所需的列。首先,它使服务器更快。另一方面,它使下一个人更容易理解查询的目的
专业提示:不要使用老式的逗号分隔表列表进行连接。使用连接
专业提示:不要以为这很复杂就挂断电话。其实很简单
专业提示:尝试对每个表中相同类型的值使用相同的列名。换句话说,在提到的所有表中调用用户iduser\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*
。而是枚举结果集中所需的列。首先,它使服务器更快。另一方面,它使下一个人更容易理解查询的目的
专业提示:不要使用老式的逗号分隔表列表进行连接。使用连接
专业提示:不要以为这很复杂就挂断电话。其实很简单
专业提示:尝试对每个表中相同类型的值使用相同的列名。换句话说,在提到的所有表中调用用户iduser\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)
如果你需要结果