【问题标题】:Use CONCAT() to merge column values into a column使用 CONCAT() 将列值合并到列中
【发布时间】:2017-02-06 08:48:38
【问题描述】:

我想使用 IF() 函数将某些列值转换为列 和 CONCAT() 函数,但我无法以某种方式正确。 在我运行这个 sql 之后:

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 行,因为所有三个值不会同时为 != 'false',这是可以预料的:如果 meta_key 值为 property_id、meta_value 和 property_value将是假的,任何其他值也是如此
  • @fthiella 我该如何解决这种情况?
  • 我会更新我的答案,从问题中不清楚,但我想我知道问题出在哪里

标签: mysql if-statement concat


【解决方案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'

【讨论】:

    【解决方案2】:

    代替

    WHERE property_id !='faslse'
    

    请使用这个,还要更正从faslsefalse的拼写

    HAVING property_id !='faslse'
    

    复制自MySQL documentation

    您可以在 GROUP BY、ORDER BY 或 HAVING 子句中使用别名

    【讨论】:

      【解决方案3】:

      请用“HAVING”子句代替“WHERE”子句

      【讨论】:

      【解决方案4】:

      问题就像@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
      

      而且它有效。感谢大家的尝试和帮助。

      【讨论】:

        猜你喜欢
        • 2018-02-03
        • 2019-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-07
        • 1970-01-01
        • 2019-11-23
        • 1970-01-01
        相关资源
        最近更新 更多