2017-02-06 3 views
0

Ich möchte bestimmte Spaltenwerte in Spalten mit IF() Funktion und CONCAT() -Funktion, aber irgendwie kann ich es nicht richtig machen. Nachdem ich diese SQL ausführen:Verwenden Sie CONCAT(), um Spaltenwerte in eine Spalte zusammenzuführen

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' 

ich diesen Fehler: 1054 - Unknown column 'PROPERTY_ID' in 'where clause'

EDIT:

Ich versuche, diese Abfrage aber kehrt 0 Zeilen ...

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

über die Bearbeitung: die Abfrage wird 0 Zeilen zurückgeben, weil alle drei Werte nicht sein werden!= 'false' zur gleichen Zeit, die zu erwarten ist: Wenn Meta_key Wert Property_id, Meta_Wert und Property_Wert ist falsch und das gleiche gilt für jeden anderen Wert – fthiella

+0

@fthiella Wie kann ich diese Art von Situation zu lösen? –

+0

Ich werde meine Antwort aktualisieren, es ist nicht klar aus der Frage, aber ich denke, ich weiß, was das Problem ist – fthiella

Antwort

0

Statt

WHERE property_id !='faslse' 

Bitte verwenden, auch die richtige Schreibweise von faslse zu false

HAVING property_id !='faslse' 

Kopiert von MySQL documentation

Sie den Alias ​​in GROUP BY verwenden können, ORDER BY oder HAVING-Klauseln

+0

Überprüfen Sie die Bearbeitung bitte –

1

Der Aliasname wird nach der WHERE-Klausel angewendet. Sie haben also zwei Möglichkeiten: wiederholen Sie die Klausel 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' 

oder eine Unterabfrage verwenden:

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' 

die Abfrage auf verschiedene Weise optimiert werden könnte, aber dies hängt von Ihren Anforderungen.

bearbeiten

Es ist von der Frage nicht klar, aber ich denke, dass das Problem, das Sie ein wenig anders lösen wollen, ist. Ich nehme an, Sie haben ein post_id Feld in Ihrer wp_postmeta Tabelle und ich nehme an, dass die Eigenschaften für jeden Beitrag in verschiedenen Zeilen sind. Mit der folgenden Abfrage können Sie die ID, Vertrags- und Mittel für einen einzelnen Post bekommen:

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 

dann können Sie nur Filter hinzufügen, mit mit:

having 
    property_agents='property_agents John Doe' 
+0

Überprüfen Sie die Bearbeitung bitte –

0

Bitte verwenden Sie „haben“ Klausel im Auftrag von „WHERE“ -Klausel

+0

Vielen Dank für 'POSTING' Duplikate Antwort http://stackoverflow.com/a/ 42063706/2893413 – Sadikhasan

+0

Überprüfen Sie die Bearbeitung bitte –

0

das Problem wie @fthiella war, sagte, dass die Werte nicht nicht falsch zugleich sein könnten, weil das ich die gleiche Spalte Auswahl wurde die IF() Aussagen zu tun. Also nach einigem Nachdenken kam ich auf diese Idee:

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 

Und es funktioniert. Danke euch allen, dass ihr es versucht und geholfen habt.

Verwandte Themen