CONCAT函数内的MYSQL SELECT语句

MI.*_*war 1 mysql sql concatenation

我试图在我非常大的 select 语句中执行类似的操作,此代码片段来自查询的 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"
Run Code Online (Sandbox Code Playgroud)

但我在“date_chain”列中得到 NULL。如果我只写这个

GROUP_CONCAT(
`alias`.`date` 
ORDER BY `alias`.`date` DESC SEPARATOR '<-') AS "date_chain"
Run Code Online (Sandbox Code Playgroud)

有用。

但我想在这条链的开头连接最新日期。

添加完整的 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;
Run Code Online (Sandbox Code Playgroud)

请问有人可以帮助我第一个语法中缺少什么吗?谢谢

Kam*_*ski 5

当作为函数参数的任何值CONCAT()NULL- 时,函数的输出计算结果为NULL。请参阅 手册以供参考。

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

尝试CONCAT_WS()在您还可以指定分隔符的地方。

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

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

评论后编辑

我们确定其原因是不正确地使用外部查询列latest_id作为内部查询的提要SELECT

  SELECT alias.`date`FROM alias WHERE id IN (latest_id)
Run Code Online (Sandbox Code Playgroud)

只是将每个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;
Run Code Online (Sandbox Code Playgroud)

尽管您的查询为您提供了您想要的结果,但这并不是实现此结果的最佳方法。在大多数情况下,您应该避免使用值,CONCAT()因为您的内部外部块作为列提要会使查询运行缓慢(它必须计算每一行的值)。NULLSELECTSELECT

请考虑以下代码作为获得相同结果的更好实践

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
Run Code Online (Sandbox Code Playgroud)