2012-06-14 46 views
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一些字段的值,其中日期=“DATE1”减去同一领域,但与日期#2,但我不当然,在左连接中我该怎么做。我试着做一个其他的LEFT JOIN到同一个表并重命名它并减去,但执行时间非常高,所以我想我的方法很糟糕。从其减去2行的MySQL查询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 

+0

我完全不知道你在问什么。 :-)你能编辑你的问题来提供一些示例数据并显示你想从这些数据中获得的输出吗?谢谢。 :-)等等;我可能拥有它。您是否正在寻找“ClientsStat.Date”等于“Date1”或“Date2”的行? –

+0

没有。当date = date1时有信息,当date = date2时有其他信息。我想把它们放在一起! –

回答

1

你应该在统计数据上加倍加入。性能,我猜想是基于索引。然而,你确定你的意思是左连接(只在第一个表上需要,而不管第二个表上是否匹配)。或者...你的意思是一个内部联接 - 你正在联接的两边预测记录。如果你想从一个记录日期减去另一个记录日期的值,我会期望找到两个记录。我写作“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) 

没有绝对的把握,如果这就是你要找的人,但我认为你错过了一个元素是一个连接到客户端统计上只是日期表...你没有资格对哪些客户端ID因此可能是您的表现失败。确保client_Stats具有(client_id,date)上的索引 - 前提是这是client_id丢失的情况,并且是client_stats表的一部分。

+0

client_id没有丢失,我只是将它从查询中移除以简化它。其实我有一个独特的“ID”创建日期和id的混合,所以这种索引使它非常快速地找到具有精确的用户ID和日期的行 –

+0

@让 - 尼古拉斯,好的,但我做了什么格式化出来可以帮助你找到可能缺失的东西?您是否正在通过提及用户ID和特定活动日期来尝试特定的单个用户/客户?我可能倾向于轻微的重组,但迄今还没有足够的信息。 – DRapp

+0

你说得对,现在表现还可以。非常感谢! –

0

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

WHERE ClientsStat.date> = '日期1' AND ClientsStat.date < = 'DATE2'

或类似的东西。

(可能需要查看有关表格的更多信息才能确切了解您正在尝试执行的操作)。 作为一般规则 - 让查询工作返回比您需要更多的行,然后工作 了解如何削减它们。