MySQL子查询在where子句中

时间:2013-03-15 09:59:09

标签: mysql query-optimization

我有一个MySQL查询,如下所示:

select 
    *, 
    (select meta_value 
        from nord_usermeta m 
        where meta_key = 'firm' and user_id = s.user_id 
        limit 1) 
        as firm, 
    (select meta_value f
        rom nord_usermeta m 
        where meta_key = 'first_name' and user_id = s.user_id 
        limit 1) 
    as first_name, 
    (select meta_value 
        from nord_usermeta m 
        where meta_key = 'last_name' and user_id = s.user_id 
        limit 1) 
    as last_name     
    from nord_submissions s 
    order by created_at desc

现在我需要使用这样的where子句缩小范围:

select 
    *, 
    (select meta_value 
        from nord_usermeta m 
        where meta_key = 'firm' and user_id = s.user_id 
        limit 1) 
        as firm, 
    (select meta_value 
        from nord_usermeta m 
        where meta_key = 'first_name' and user_id = s.user_id 
        limit 1) 
    as first_name, 
    (select meta_value 
        from nord_usermeta m 
        where meta_key = 'last_name' and user_id = s.user_id 
        limit 1) 
    as last_name 

    from nord_submissions s 
    where firm like '%DG%' 
    order by created_at desc

问题显然是我使用子查询,但我找不到在where子句中引用它的方法 请帮忙。

2 个答案:

答案 0 :(得分:3)

为什么这么长...尝试使用SELF JOIN(在查询中加入相同的表格)..见下文(未测试)

 SELECT ns.*,
        um1.meta_value AS firmName,
        um2.meta_value AS firstName,
        um3.meta_value AS lastName
 FROM nord_submission ns
 INNER JOIN nord_usermeta um1 USING(id) AND meta_key = 'firm'
 INNER JOIN nord_usermeta um2 USING(id) AND meta_key = 'first_name'
 INNER JOIN nord_usermeta um3 USING(id) AND meta_key = 'last_name'
 WHERE um1.meta_value LIKE '%DG%'
 ORDER BY ns.created_at

注意:如果两个表都有不同的列名,您可以互相引用,那么您可以将USING(id)替换为ns.user_id = um1.user_id等等上

答案 1 :(得分:1)

如果您要使用密钥而不是列,则必须让应用程序对其进行排序。使用如此多的子查询,您将看到性能损失。

SELECT *
FROM nord_submissions 
 INNER JOIN nord_usermeta 
 USING (user_id)
WHERE (meta_key='last_name' or meta_key='first_name' or (meta_key='firm' and meta_value LIKE '%DG%') )
ORDER BY created_at desc
相关问题