CONCAT函数内的MYSQL SELECT语句

时间:2015-04-15 20:49:56

标签: mysql sql concat

我试图在我的大选择语句中做这样的事情,这段代码片段来自查询的SELECT部分​​

CONCAT((SELECT alias.`date` FROM alias WHERE id IN(latest_id)),'<-',GROUP_CONCAT(
`alias`.`date` ORDER BY `alias`.`date` DESC SEPARATOR '<-')) AS "date_chain"

但我在&#34; date_chain&#34;中得到NULL柱。如果我只写这个

GROUP_CONCAT(
`alias`.`date` 
ORDER BY `alias`.`date` DESC SEPARATOR '<-') AS "date_chain"

有效。

但是我想在这个链的开头结束最新的约会。

添加完整的SQL

SELECT latest_id,CONCAT((SELECT alias.`date`FROM alias WHERE id IN (latest_id)),'<-',
GROUP_CONCAT(
  `alias`.`date` 
  ORDER BY `alias`.`date` DESC SEPARATOR '<-'
)) AS "date_chain" FROM alias WHERE latest_id IS NOT NULL GROUP BY latest_id;

请问有人可以帮我解释我的第一句语法中缺少的内容吗?谢谢

1 个答案:

答案 0 :(得分:4)

CONCAT()函数的任何值为NULL时,函数的输出结果为NULL。请参阅manual以供参考。

  

如果任何参数为NULL,则CONCAT()返回NULL。

尝试CONCAT_WS(),您也可以在其中指定分隔符。

  

CONCAT_WS()不会跳过空字符串。但是,它会在分隔符参数后跳过任何NULL值。

但是,不要将NULL作为分隔符 - 这会导致结果产生NULL

评论后修改

我们确定原因是外部查询列latest_id使用不当作为内部SELECT的Feed。

  SELECT alias.`date`FROM alias WHERE id IN (latest_id)

只是将同一行中的每个idlatest_id进行比较,而期望的结果是将其与外部SELECT块中的列进行比较。

更改后的查询应

SELECT 
  latest_id,
  CONCAT(
    (SELECT alias.`date`FROM alias WHERE id IN (o.latest_id)),
    '<-',
    GROUP_CONCAT(
      `alias`.`date` ORDER BY `alias`.`date` DESC SEPARATOR '<-'
    )
  ) 
  AS "date_chain" 
FROM alias o
WHERE latest_id IS NOT NULL
GROUP BY latest_id;

虽然您的查询为您提供了所需内容,但这并不是实现此结果的最佳方式。在大多数情况下,您应该避免使用CONCAT(),因为NULL值而您SELECT位于外部SELECT块内,因为列Feed会使查询运行缓慢(必须计算每行的值)。

请将以下代码视为更好的做法,以获得相同的结果

SELECT
  foo.latest_id,
  CONCAT_WS('<-', a.date, foo.group_concat) AS date_chain
FROM(
  SELECT  
    latest_id, 
    GROUP_CONCAT(date ORDER BY date DESC SEPARATOR '<-') AS group_concat
  FROM alias
  WHERE latest_id IS NOT NULL
  GROUP BY latest_id
) foo
LEFT JOIN alias a ON
  foo.latest_id = a.id