MYSQL SELECT CONCAT 函数内的语句
MYSQL SELECT statement inside CONCAT function
我试图在我非常大的 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"
但我在 "date_chain" 列中得到 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;
有人可以帮我看看我的第一个语法中缺少什么吗?谢谢
当作为 CONCAT()
函数的参数的任何值是 NULL
时 - 函数的输出计算为 NULL
。请参阅 manual 以供参考。
CONCAT() returns NULL if any argument is NULL.
试试 CONCAT_WS()
也可以在其中指定分隔符。
CONCAT_WS() does not skip empty strings. However, it does skip any NULL values after the separator argument.
但是,不要将 NULL
作为分隔符 - 这会导致结果产生 NULL
.
评论后编辑
我们确定这是因为外部查询列 latest_id
不当用作内部 SELECT
.
的提要
SELECT alias.`date`FROM alias WHERE id IN (latest_id)
只是将同一行中的每个 id
与 latest_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
块内,因为列提要会使查询 运行 变慢(它必须计算每一行的值)。
请将以下代码视为获得相同结果的更好做法
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
我试图在我非常大的 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"
但我在 "date_chain" 列中得到 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;
有人可以帮我看看我的第一个语法中缺少什么吗?谢谢
当作为 CONCAT()
函数的参数的任何值是 NULL
时 - 函数的输出计算为 NULL
。请参阅 manual 以供参考。
CONCAT() returns NULL if any argument is NULL.
试试 CONCAT_WS()
也可以在其中指定分隔符。
CONCAT_WS() does not skip empty strings. However, it does skip any NULL values after the separator argument.
但是,不要将 NULL
作为分隔符 - 这会导致结果产生 NULL
.
评论后编辑
我们确定这是因为外部查询列 latest_id
不当用作内部 SELECT
.
SELECT alias.`date`FROM alias WHERE id IN (latest_id)
只是将同一行中的每个 id
与 latest_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
块内,因为列提要会使查询 运行 变慢(它必须计算每一行的值)。
请将以下代码视为获得相同结果的更好做法
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