我有一个FMP数据库,我想用SQL查询。 我正在尝试一次查询3个或更多表。
表结构如下:
########## ###############
# USER # --> # PROJECTS #
########## ###############
| ###########
----> # SAMPLES #
| ###########
|
| #####################
----> # PROCESSED_SAMPLES #
#####################
它们都是由user_id链接的。
USER包含很多字段,但在这种情况下重要的是:
每个用户可以在多个PROJECTS下,并且可以有多个SAMPLES和PROCESSED SAMPLES。每个样本都有一个DATE和VISIT_STATUS。每个处理过的样本都有字段DATE,ORIGIN和LEVEL
我一直在想的问题是(在非实际的SQL中):
> SELECT STATUS, count(num of USERS) FROM (tables) WHERE project = X AND LEVEL >= 1 GROUP BY STATUS
> SELECT STATUS, count(num of USERS) FROM (tables) WHERE project = X AND LEVEL >= 1 AND ORIGIN = Y
> SELECT STATUS, count(num of USERS) FROM (tables) WHERE project = X AND LEVEL >= 1 AND ORIGIN = Y AND (processed sample.DATE = sample.DATE AND sample.VISIT_STATUS = Z)
我正在尝试查找在特定项目下工作的每个不同状态的USERS数量,这些USERS具有来自特定来源的处理样本,其级别为> =
查询通过两个表,如下面的查询工作。但是我用两个以上的表做任何类型的JOIN都没有成功。
SELECT STATUS, count(STATUS) as c
FROM
USER A
JOIN
PROJECTS B
on A.user_id = B.user_id
WHERE B.project = X
GROUP BY STATUS
ORDER BY c DESC
我没有成功这样的事情:
SELECT STATUS, count(STATUS) as c
FROM
USER A
JOIN
PROJECTS B
on A.user_id = B.user_id
JOIN
PROCESSED SAMPLES C
on B.user_id = C.user_id
WHERE B.project = X C.LEVEL >= 1
GROUP BY STATUS
ORDER BY c DESC
我不完全确定这个表结构是否允许我像这样进行连接。我尝试过的另一种方式是:
SELECT STATUS, count(STATUS) as c
FROM
USER A
JOIN
PROJECTS B
on A.user_id = B.user_id
JOIN
( SELECT user_id, sum(CASE WHEN LEVEL >= 1 THEN 1 ELSE 0) as s
FROM PROCESSED_SAMPLES
GROUP BY user_id ) AS C
on B.user_id = C.user_id
WHERE B.project = X AND C.s > 0
GROUP BY STATUS
ORDER BY c DESC
这似乎也没有用。因为我正在通过FMP,如果我的查询中有错误,我会觉得这个超级有用'?'回。虽然我不想大幅改变表格结构,但我完全可以在表格中添加更多字段。
谢谢!
答案 0 :(得分:0)
我认为,您的上一个查询无效 - FileMaker对子查询的支持有限。第二个查询应该有效。
您的WHERE参数之间缺少AND。
GROUP BY STATUS
检查此列是否存在于多个表中。如果是这种情况,请添加表格说明符。
ORDER BY c DESC
加入处理样本C
您有两个不同的东西分配给同一个别名 - " c"。我怀疑第二个赋值会覆盖第一个赋值,因此ORDER BY会尝试按表对象而不是列进行排序。