我试图在我的大选择语句中做这样的事情,这段代码片段来自查询的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;
请问有人可以帮我解释我的第一句语法中缺少的内容吗?谢谢
答案 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)
只是将同一行中的每个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
块内,因为列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