簡體   English   中英

CONCAT函數中的MYSQL SELECT語句

[英]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()函數的NULLNULL -函數的輸出結果為NULL 請參閱手冊以供參考。

如果任何參數為NULL,則CONCAT()返回NULL。

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

CONCAT_WS()不會跳過空字符串。 但是,它會跳過分隔符參數之后的所有NULL值。

但是,請勿將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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM