[英]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.