SELECT id, country FROM my_records
MySQL クエリから上記の結果を取得しました。結果から重複した ID を削除したいと考えています。PHP コードを使用するのではなく、MySQL クエリを使用します。同じことを行う関数またはクエリはありますか。
ありがとう
SELECT id, country FROM my_records
MySQL クエリから上記の結果を取得しました。結果から重複した ID を削除したいと考えています。PHP コードを使用するのではなく、MySQL クエリを使用します。同じことを行う関数またはクエリはありますか。
ありがとう
私は同様の状況に陥り、MySql がこの問題を解決するための定義済み関数を提供していないことに気付きました。
克服するために、UDF を作成しました。以下の定義と使用法をご覧ください。
DROP FUNCTION IF EXISTS `get_unique_items`;
DELIMITER //
CREATE FUNCTION `get_unique_items`(str varchar(1000)) RETURNS varchar(1000) CHARSET utf8
BEGIN
SET @String = str;
SET @Occurrences = LENGTH(@String) - LENGTH(REPLACE(@String, ',', ''));
SET @ret='';
myloop: WHILE (@Occurrences > 0)
DO
SET @myValue = SUBSTRING_INDEX(@String, ',', 1);
IF (TRIM(@myValue) != '') THEN
IF((LENGTH(@ret) - LENGTH(REPLACE(@ret, @myValue, '')))=0) THEN
SELECT CONCAT(@ret,@myValue,',') INTO @ret;
END if;
END IF;
SET @Occurrences = LENGTH(@String) - LENGTH(REPLACE(@String, ',', ''));
IF (@occurrences = 0) THEN
LEAVE myloop;
END IF;
SET @String = SUBSTRING(@String,LENGTH(SUBSTRING_INDEX(@String, ',', 1))+2);
END WHILE;
SET @ret=concat(substring(@ret,1,length(@ret)-1), '');
return @ret;
END //
DELIMITER ;
使用例:
SELECT get_unique_items('2,2,2,22,2,3,3,3,34,34,,54,5,45,,65,6,5,,67,6,,34,34,2,3,23,2,32,,3,2,,323') AS 'Items';
結果:
2,22,3,34,54,45,65,67,23,32,323
この助けを願っています!
これはあなたを助けるかもしれません。
DELIMITER //
DROP FUNCTION IF EXISTS `find_duplicate_using_comma` //
CREATE FUNCTION `find_duplicate_using_comma` (in_str LONGTEXT) RETURNS LONGTEXT
DETERMINISTIC
NO SQL
BEGIN
DECLARE out_str LONGTEXT DEFAULT NULL; -- pending output
DECLARE next_str TEXT DEFAULT NULL; -- next element under consideration
dedup:
LOOP
IF CHAR_LENGTH(TRIM(in_str)) = 0 OR in_str IS NULL THEN
LEAVE dedup; -- no more data to consider
END IF;
SET next_str = SUBSTRING_INDEX(in_str,',',1); -- find the next element
SET in_str = SUBSTRING(in_str FROM (CHAR_LENGTH(next_str) + 1 + 1)); -- remove that element
SET in_str = TRIM(in_str), next_str = TRIM(next_str); -- trim the new and the rest
IF FIND_IN_SET(next_str,out_str) OR CHAR_LENGTH(next_str) = 0 THEN -- if empty or already found
ITERATE dedup;
END IF;
SET out_str = CONCAT_WS(',',out_str,next_str); -- append the new to pending output
END LOOP;
RETURN out_str;
END //
DELIMITER ;
例 :
SELECT find_duplicate_using_comma('6675,8661,8661,8661,8661,8661,8661,8661,8661,8661,8661,8661,8661,8661,8661,8661,8661,8661') AS data;
Result : 6675,8661
与えられた他の解決策は大文字と小文字を区別しません。結果で大文字と小文字を区別し、「o」や「ö」などのアクセント付きの一致を削除せず、完全一致と厳密一致を探す場合は、次のコードを使用します。
utf8mb4_bin が機能しない場合は、utf8_bin または他のバイナリ タイプを試してください。
DELIMITER //
DROP FUNCTION IF EXISTS `find_duplicate_using_comma` //
CREATE FUNCTION `find_duplicate_using_comma` (in_str LONGTEXT) RETURNS LONGTEXT
DETERMINISTIC
NO SQL
BEGIN
DECLARE out_str LONGTEXT DEFAULT NULL; -- pending output
DECLARE next_str TEXT DEFAULT NULL; -- next element under consideration
dedup:
LOOP
IF CHAR_LENGTH(TRIM(in_str)) = 0 OR in_str IS NULL THEN
LEAVE dedup; -- no more data to consider
END IF;
SET next_str = SUBSTRING_INDEX(in_str,',',1); -- find the next element
SET in_str = SUBSTRING(in_str FROM (CHAR_LENGTH(next_str) + 1 + 1)); -- remove that element
SET in_str = TRIM(in_str), next_str = TRIM(next_str); -- trim the new and the rest
IF FIND_IN_SET(next_str collate utf8mb4_bin,out_str collate utf8mb4_bin) OR CHAR_LENGTH(next_str) = 0 THEN -- if empty or already found
ITERATE dedup;
END IF;
SET out_str = CONCAT_WS(',',out_str,next_str); -- append the new to pending output
END LOOP;
RETURN out_str;
END //
DELIMITER ;