搜尋

首頁  >  問答  >  主體

能否將多個MySQL行連接成一個欄位?

<p>使用<code>MySQL</code>,我可以做以下操作:</p> <pre class="brush:php;toolbar:false;">SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;</pre> <p><strong>我的產出:</strong></p> <pre class="brush:php;toolbar:false;">shopping fishing coding</pre> <p>但我只要一行一列:</p> <p><strong>期望的輸出:</strong></p> <pre class="brush:php;toolbar:false;">shopping, fishing, coding</pre> <p>原因是我從多個表中選擇多個值,而在所有的連接之後,我得到了比我想要的更多的行。 </p> <p>我在MySQL文件中找了一個函數,看起來<code>CONCAT</code>或<code>CONCAT_WS</code>函數不接受結果集。 </p> <p>所以這裡有人知道如何做到這一點嗎? </p>
P粉556159786P粉556159786519 天前517

全部回覆(2)我來回復

  • P粉366946380

    P粉3669463802023-08-23 12:03:30

    如果你的MySQL版本(4.1)支持,可以看看GROUP_CONCAT。更多詳細資訊請參考文件

    查詢語句如下:

    SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
      FROM peoples_hobbies 
      WHERE person_id = 5 
      GROUP BY 'all';

    回覆
    0
  • P粉002023326

    P粉0020233262023-08-23 10:26:52

    您可以使用GROUP_CONCAT函數:

    SELECT person_id,
       GROUP_CONCAT(hobbies SEPARATOR ', ')
    FROM peoples_hobbies
    GROUP BY person_id;

    正如Ludwig在他的評論中所述,您可以添加DISTINCT運算子以避免重複:

    SELECT person_id,
       GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
    FROM peoples_hobbies
    GROUP BY person_id;

    如Jan在他們的評論中所述,您也可以在合併之前對值進行排序,使用ORDER BY

    SELECT person_id, 
           GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
    FROM peoples_hobbies
    GROUP BY person_id;

    正如Dag在他的評論中所述,結果有一個1024位元組的限制。為了解決這個問題,在您的查詢之前執行以下查詢:

    SET group_concat_max_len = 2048;

    當然,您可以根據需要更改2048的值。計算並指派值的方法如下:

    SET group_concat_max_len = CAST(
                         (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
                               FROM peoples_hobbies
                               GROUP BY person_id) AS UNSIGNED);

    回覆
    0
  • 取消回覆