2017-02-06 15 views
0

我想使用IF()函數 和CONCAT()函數將某些列值轉換爲列,但我無法以某種方式得到它。 我運行這個SQL後:使用CONCAT()將列值合併到一列

SELECT 

IF(meta_key = 'property_id', CONCAT(meta_key, ' ', meta_value), 'false') AS property_id, 
IF(meta_key = 'property_contract', CONCAT(meta_key, ' ', meta_value), 'false') AS property_contract, 
IF(meta_key = 'property_agents', CONCAT(meta_key, ' ', meta_value), 'false') AS property_agents 


FROM wp_postmeta 

WHERE property_id !='faslse' 
and property_agents = 'John Doe' 

我得到這個錯誤 - :

我想這個查詢,但回報1054未知列在 'where子句'

編輯 'PROPERTY_ID' 0行...

select * 

from 
( select 
    IF(meta_key = 'property_id', CONCAT(meta_key, ' ', meta_value), 'false') AS property_id, 
    IF(meta_key = 'property_contract', CONCAT(meta_key, ' ', meta_value), 'false') AS property_contract, 
    IF(meta_key = 'property_agents', CONCAT(meta_key, ' ', meta_value), 'false') AS property_agents 

from 
    wp_postmeta) p 


WHERE 
p.property_id != 'false' 
    and p.property_contract != 'false' 
    and p.property_agents!= 'false' 
+0

關於編輯:查詢將返回0行,因爲所有三個值都不會!='false'必須預期:如果meta_key的值爲property_id,則meta_value和property_value將爲false,對於其他任何值 – fthiella

+0

@fthiella我該如何解決這種情況? –

+0

我會更新我的答案,但不清楚這個問題,但我想我知道什麼是問題 – fthiella

回答

0

而不是

WHERE property_id !='faslse' 

請使用,也是正確的拼寫從faslsefalse

HAVING property_id !='faslse' 

MySQL documentation

複製您可以使用別名在GROUP BY,ORDER BY或HAVING子句

+0

檢查編輯請 –

1

該別名應用於where子句之後,因此您有兩個選擇,重複IF子句:

select 
    IF(meta_key = 'property_id', CONCAT(meta_key, ' ', meta_value), 'false') AS property_id, 
    IF(meta_key = 'property_contract', CONCAT(meta_key, ' ', meta_value), 'false') AS property_contract, 
    IF(meta_key = 'property_agents', CONCAT(meta_key, ' ', meta_value), 'false') AS property_agents 

from 
    wp_postmeta 
where 
    IF(meta_key = 'property_id', CONCAT(meta_key, ' ', meta_value), 'false') !='faslse' 
    and IF(meta_key = 'property_agents', CONCAT(meta_key, ' ', meta_value), 'false') = 'John Doe' 

或使用子查詢:

select * 
from 
    (
    select 
     IF(...) as property_id, 
     IF(...) as property_agents 
    from 
     wp_postmeta 
) s 
where 
    s.property_id != 'false' 
    and s.property_agents = 'John Doe' 

的查詢可以以各種方式進行優化,但是這取決於你的需求。

編輯

這不是來自這個問題不清楚,但我認爲,要解決的問題是有點不同。我想你的wp_postmeta表中有post_id字段,我想每個帖子的屬性都在不同的行中。用下面的查詢,你可以得到一個職位的ID,合同及代理:

select 
    post_id, 
    max(case when meta_key = 'property_id' then CONCAT(meta_key, ' ', meta_value) end) as property_id, 
    max(case when meta_key = 'property_contract' then CONCAT(meta_key, ' ', meta_value) end) as property_contract, 
    max(case when meta_key = 'property_id' then CONCAT(meta_key, ' ', meta_value) end) as property_agents 
from 
    wp_postmeta 
group by 
    post_id 

那麼你可以添加過濾器具有:

having 
    property_agents='property_agents John Doe' 
+0

檢查編輯請 –

0

請使用「具有」條款代表WHERE「子句

+0

謝謝你'POSTING'重複回答http://stackoverflow.com/a/ 42063706/2893413 – Sadikhasan

+0

請檢查編輯 –

0

問題就像@fthiella說 的值不能同時爲非假,因爲我選擇了相同的 列來執行IF()語句。所以經過一番思考後,我想出了這個:

SELECT 
p_id.property_id , 
p_agents.property_agents, 
p_contract.property_contract 
FROM 

(SELECT post_id , IF(meta_key = 'property_contract', meta_value , 'false') AS property_contract FROM wp_postmeta HAVING property_contract != 'false')p_contract 
INNER join 
(SELECT post_id , IF(meta_key = 'property_agents', meta_value , 'false') AS property_agents FROM wp_postmeta HAVING property_agents != 'false')p_agents 
ON 
p_contract.post_id = p_agents.post_id 
INNER join 
(SELECT post_id , IF(meta_key = 'property_id', meta_value , 'false') AS property_id FROM wp_postmeta HAVING property_id != 'false')p_id 
ON 
p_contract.post_id = p_id.post_id 
GROUP BY p_contract.post_id Order by p_contract.post_id 

它的工作原理。謝謝大家的努力和幫助。