簡體   English   中英

如何將逗號分隔值分組為不同的排序逗號分隔值

[英]How to group comma separated values into distinct sorted comma separated values

我正在嘗試計算一段sql,想知道我嘗試做的事情是否可能,如果可以,我將如何去做呢? 我的目標是,如果可能的話,返回具有與該線程ID相關聯的所有唯一值的線程ID。 在下面的示例中,我顯示了到達的距離以及嘗試到達的位置。

$sql = SELECT `ThreadID`, `PostTags` FROM `ma_posts` WHERE `PostTags` IS NOT   NULL AND `PostTags` != '0' AND `PostTags` != ' ' ORDER BY `ThreadID`

返回當前結果
在此處輸入圖片說明

想要返回按字母順序排序的離散值的最終分組結果

在此處輸入圖片說明

在上面的示例中,名稱“ Jon”的第二個實例已從為ThreadID 14返回的名稱中刪除,所有名稱都壓縮為一個字符串/位數據。 名稱Barry和Mary的第二個和第三個實例已從壓縮的ThreadID 20中刪除。

我嘗試的可能嗎? 如果可以,怎么辦?

我查看了Stackoverflow和網絡,但沒有找到一個真正說明我正在嘗試做的事的例子。 可能(希望)這是可能的,因此我不必再通過PHP過濾即將到來的結果。 這將使生活簡單得多。

謝謝您一如既往的幫助,人們從Monkee歡呼

您應該真正考慮規范化架構。 然后,解決方案將變得微不足道。

現在,您可以嘗試將逗號分隔的值轉換為單獨的行,然后應用UPPER,LOWER和SUBSTR的組合將字符串的第一個字符轉換為大寫,將其余的字符轉換為小寫(將“ barry”轉換為“ Barry”)。 最后,應用GROUP_CONCAT並使用“ distinct”和“ by by”選項來獲得所需的結果。

嘗試這個:

SELECT 
    threadid,
    GROUP_CONCAT(DISTINCT posttag
        ORDER BY posttag
        SEPARATOR ', ') posttags
FROM
    (SELECT 
        threadid,
            CONCAT(UPPER(SUBSTR(posttag, 1, 1)), LOWER(SUBSTR(posttag, 2))) posttag
    FROM
        (SELECT 
        t.threadid,
            SUBSTRING_INDEX(SUBSTRING_INDEX(t.posttags, ', ', t2.i), ', ', - 1) posttag
    FROM
        t
    JOIN (SELECT 1 i UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t2
    ON CHAR_LENGTH(t.posttags) - CHAR_LENGTH(REPLACE(t.posttags, ', ', '')) >= 2 * (t2.i - 1)) t) t
GROUP BY threadid;

如果郵戳中的值可以超過5個,則始終可以在子查詢中引發更多UNION ALL

現場演示

看來您的數據庫未規范化。 您需要將其規范化為第三范式。 無論如何,您都無法在查詢中distinct單詞,這將選擇唯一的值。

$sql = SELECT distinct `ThreadID`, `PostTags` FROM `ma_posts` WHERE `PostTags` IS NOT NULL 
AND `PostTags` != '0' AND `PostTags` != ' ' ORDER BY `ThreadID`

暫無
暫無

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

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