在MySQL查询左联接中减去2行
问题是我想让ClientsStat中的一些字段的值,其中date=“DATE1”减去相同的字段,但带有日期#2,但我不确定在左联接中如何才能做到这一点。我尝试对同一个表进行另一个左连接,并重命名它和进行减法运算,但执行时间非常长,所以我猜我的方法不好 编辑: 我的结果是:在MySQL查询左联接中减去2行,mysql,database,Mysql,Database,问题是我想让ClientsStat中的一些字段的值,其中date=“DATE1”减去相同的字段,但带有日期#2,但我不确定在左联接中如何才能做到这一点。我尝试对同一个表进行另一个左连接,并重命名它和进行减法运算,但执行时间非常长,所以我猜我的方法不好 编辑: 我的结果是: SELECT * From `users` AS `User` LEFT JOIN `selections` AS `Selections` ON (`Selections`.`user_id` = `User`.`id`)
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""")
等等
我想这样:
USER => fields...
SELECTIONS => fields...
CLIENTS => fields..
CLIENT_STATS => field x,y,z on date = date 1
等等。首先:
您必须使用另一个表中的字段左键连接到client_stats。因此,首先让连接正常工作。现在的情况是,该查询是否运行?
第二:
然后,可以使用日期上的WHERE子句限制ClientsStat.date上的日期范围:
其中ClientsStat.date>='date1'和ClientsStat.date您应该能够在统计数据上进行双连接。我猜性能是基于索引的。但是,您确定是指左联接(无论第二个表是否匹配,第一个表都需要左联接)。或您是指内部联接吗?您希望联接的两侧都有记录。如果您试图从一个记录日期减去另一个记录日期的值,我希望两个条目都能找到。我写的是“连接”(双方必须存在)而不是“左连接”的基础
不完全确定这是否是您正在寻找的,但我认为您错过的一个元素是在某个日期加入客户端统计表。。。您没有关于哪个客户端ID的限定符,因此可能是您的性能失败的原因。确保client_Stats在(client_id,date)上有一个索引,前提是client_id丢失并且是client_Stats表的一部分。我完全不知道您在问什么。:-)您能否编辑您的问题以提供一些示例数据,并显示您试图从这些数据中获得的输出?谢谢。:-)等待我可能有。您正在查找
客户端stat.Date
等于日期1
或日期2
的行吗?否。日期=日期1时有信息,日期=日期2时有其他信息。我想把它们减到一起!client_id没有丢失,我只是将其从查询中删除以简化它。事实上,我有一个唯一的“id”,它是由日期和id混合创建的,所以这个索引可以非常快速地找到具有精确用户id和id的行date@Jean-尼古拉斯,好吧,但我的格式是否有助于你了解可能遗漏的内容?您是否通过提及用户ID和具体活动日期来尝试特定的单个用户/客户?我可能倾向于轻微的重组,但到目前为止还没有足够的信息。你说得对,现在的表现还不错。谢谢!
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
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 )