0
SELECT * From `users` AS `User`
LEFT JOIN `selections` AS `Selections` ON (`Selections`.`user_id` = `User`.`id`)
LEFT JOIN  `clients` AS `Client` ON (`Client`.`id` = `Selections`.`client_id`)
LEFT JOIN  `client_stats` AS `ClientsStat` ON (`ClientsStat`.`date` = """DATE1""")

问题是我想在 ClientsStat 中获取某些字段的值,其中 date = "DATE1" 减去相同的字段但日期为 #2 但我不确定在 LEFT JOIN 中如何做到这一点。我尝试对同一个表进行另一个 LEFT JOIN 并重命名并减去但执行时间非常长,所以我想我的方法很糟糕。

编辑:

我的结果是这样的:

USER => fields...
SELECTIONS => fields...
CLIENTS => fields..
CLIENT_STATS => field x,y,z on date = date 1

等等。

我想要这个:

USER => fields
USERSELECTIONS => fields...
CLIENTS => fields..
CLIENT_STATS => field x,y,z when client_stats.date = date1 MINUS field x,y,z when client_stats.date = date2

等等

4

2 回答 2

1

您应该擅长统计数据的双重联接。性能,我猜是基于索引。但是,您确定您的意思是左连接(仅在第一个表上需要,无论第二个表是否匹配)。或者...您的意思是 INNER JOIN - 您期望在连接的双方都有记录。如果您试图从一个记录日期减去另一个记录日期的值,我希望找到两个条目。我写的是“JOIN”(双方都必须存在)而不是“LEFT JOIN”的基础。

SELECT 
      U.* 
      CS1.x - CS2.x as XDiff,
      CS1.y - CS2.y as YDiff,
      CS1.z - CS2.z as ZDiff
   From 
      users U
         JOIN selections S
            ON U.ID = S.User_ID
            JOIN clients C
               ON S.Client_ID = C.ID
               JOIN  client_stats CS1
                  ON ( C.ID = CS1.Client_ID AND CS1.`date` = YourFirstDateVariable )
               JOIN  client_stats CS2
                  ON ( C.ID = CS2.Client_ID AND CS2.`date` = YourSecondDateVariable )

不确定这是否是您要查找的内容,但我认为您错过的一个元素是仅在日期加入客户端统计信息表......您在 WHICH 客户端 ID 上没有限定符,因此可能是失败你的表现。确保 client_Stats 在 (client_id,date) 上有一个索引——前提是 client_id 丢失并且是 client_stats 表的一部分。

于 2012-06-14T17:01:29.153 回答
0

首先:您必须使用来自其他表之一的字段离开连接到 client_stats。所以首先让连接正常工作。现在的方式 - 该查询是否运行?第二:然后您可以在日期上使用 WHERE 子句限制 ClientsStat.date 上的日期范围:

WHERE ClientsStat.date >= 'date1' AND ClientsStat.date <= 'date2'

或类似的东西。

(可能需要查看有关表格的更多信息,以准确了解您要执行的操作)。作为一般规则 - 让查询返回比您需要的更多的行,然后找出如何减少它们。

于 2012-06-14T16:35:04.077 回答