2013-03-15 309 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