2017-04-17 55 views
0

我有一个很难优化这样的查询,MySQL的优化或者在选择的

SELECT * 
FROM transactions AS t 
    INNER JOIN users AS u 
    ON u = t.user_id 
WHERE (
    u.id = 123 
    OR u.id IN (
    SELECT user_id FROM users_parents AS up 
    WHERE up.parent_id = 123 
) 
) 

我熬下来的必要,改变了字段名称简单的字段不用英文,所以如果有任何语法错误,最有可能是因为这个。

查询需要从某个(父)用户返回的所有交易,或与母公司用户相关

但是,由于IN的使用情况选择性能的任何用户是可怕的,它的我花了超过6秒的时间在数据库的一小部分上运行这个查询,整个查询数据库超过了600秒!

我读过我应该使用JOIN,但我所有的尝试都给了我不同的最终结果在查询中,我认为我被卡住做错误的语法,我找不到自己的逻辑/语法缺陷因为我一直花费太多时间来查看它,并且一遍又一遍地重做/重做相同的代码。

数据库结构是相当简单的,

= transactions 
id|user_id|.... 
= users 
id|.... 
= users_parents 
id|parent_id|user_id 

任何输入是非常感谢!

+0

不知道它是如何运行没有错误,但应该加入条件不是'ON u.id = t.user_id'而不是'ON u = t.user_id'? –

+0

@DarshanMehta - 当然,我必须在覆写它时重写它。 – Zjahn

回答

0
SELECT transactions.*, users.* 
FROM transactions AS t 
JOIN users AS u ON u.id = t.user_id 
LEFT JOIN users_parents up on up.user_id = u.id 
WHERE u.id = 123 or up.parent_id = 123 

ps。我想用户对父母是n为1.(1个用户只有1个父母,不同的用户可以有相同的父母)。

+0

完全正确! 像魅力一样工作 – Zjahn

+0

@Zjahn乐于帮忙 – amow