2013-03-15 278 views
-2

我有一个MySQL查询这是这样的:MySQL的子查询的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 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子句中引用它。
请帮忙。

+0

“问题”..什么问题?你可以请扩展你的问题与错误消息/示例数据库模式/示例数据等 - 可能甚至是一个小提琴http://sqlfiddle.com/about.html – Steve 2013-03-15 10:06:35

+0

**企业**是一个用户定义的列..我们可以称之为虚构的列太..和WHERE只适用于数据库列。你应该用'HAVING'来代替'WHERE' – diEcho 2013-03-15 10:23:53

回答

3

为什么要这么久......尝试自连接(连接查询相同的表)..见下文(未测试)

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 

注:如果两个表具有不同的列名,由其中U refrence对方,那么你可以在

+1

thnx很多,这个工作有点微调 – Nick 2013-03-15 11:08:41

1

ns.user_id = um1.user_id等取代USING(id)如果你要使用的密钥,而不是列,你必须让应用程序把它清除出来。使用这么多的子查询,您会看到性能受到影响。

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 
+0

这并不完全错误(当你删除'AND公司like..'!),但它不是很好格式化(你的将有多行,而OP和diEcho的查询每nord_submissions行只有一行),无论如何,我会为你的努力和替代解决方案编辑上面提到的“AND firm....”和+1。 – fancyPants 2013-03-15 10:43:02