2013-03-30 2 views
1

내 사용자 테이블에 userid 열과 membergroupids 열이 있습니다. 지금까지 내가 가진 쿼리가 있습니다. 열에 이미 값이있는 값 뒤에 값을 삽입하는 방법 mysql

UPDATE `user` 
SET `membergroupids`=`,100` 
WHERE `userid` IN 
(
    312 , 331 , 538 , 528 , 77 , 80 , 293 , 343 , 609 , 607 , 547 , 596 , 216 , 
    780 , 1 , 884 , 430 , 500 , 881 , 952 , 957 , 979 , 352 , 994 , 955 , 776 , 
    744 , 904 , 1038 , 76 , 1083 , 61 , 202 , 1001 , 1173 , 1176 , 418 , 770 , 
    1192 , 191 , 1211 , 1206 , 1247 , 402 , 423 , 584 , 1233.1282 , 167 , 1329, 
    1330 , 376 , 1227 , 146 , 1113 , 1327 , 1352 , 254 , 1065 , 1406 , 1225 , 
    1230 , 1405 , 1443 , 812 , 1295 , 1510 , 1571 , 1565 , 1468 , 1349 , 1645 , 
    501 , 1312 , 1718 , 13 , 200 , 1177 , 1785 , 107 , 540 , 1591 , 1508 , 59 , 
    1867 , 222 , 1520 , 782 , 26 , 332 , 474 , 1837 , 1828 , 1431 , 1951 , 1953 , 
    1950 , 847 , 1477 , 1726 , 1669 , 1185 , 1955 , 1872 , 1926 , 1392 , 853 , 
    1892 , 2020 , 1511 , 2027 , 2197 , 2184 , 2134 , 2239 , 119 , 122 
) 

그래서 기본적으로 .. 나는 그들의 아이디에 나열된 것들() 중 하나 인 경우 열 membergroupids에 "100"그렇게 쿼리를 추가하기 위해 노력하고 내가 뭘하려고 오전된다.
그러나 여기에 문제가 있습니다. 이 모든 사용자는 이미 membergroupid에 나열된 값을가집니다. 예를 들어
는, 사용자 (312)가 이미 열 membergroupids이 값이 있습니다
는 35,49,58,61,71,38,59
그래서,이 쿼리는 자신의 분야에이 작업을 수행 할 필요가 :
(35) 49,58,61,71,38,59,100

및 나열된 다른 모든 사용자 ID의 경우.

아무도 도와 주셔서 감사합니다. 나는 이것이 google에있다라고 확신한다. 그러나 나는 그것을 말하는 방법을 모르고 있었다. 스키마를 변경할 수없는 불행한 위치에있어 이후

+1

이들은 backticks가 아닌 '', 100''c이어야합니다. 그러나 이것은 실제로 당신을 두통을 일으키는 원인이되기 위해 결국 돌아올 잘못된 접근법입니다. 그룹 구성원을 나타내는 ID를 그룹화하여 값 문자열로 저장하는 대신 구성원 ID를 조인하는 별도의 테이블을 사용해야합니다. –

+0

하지만 이런 식으로해야한다면, 이전 값으로 새 값을 연결해야합니다 : SET membergroupids = CONCAT (membergroupids, ', 100') ' –

+0

안녕하세요. 나는 vBulletin을 사용하고 있으며, 이것이 어떻게 설정되어 있는지를 보여줍니다. 보시다시피, 100 점 이상입니까? 거기에 사용자가 있습니다. 나는 userid에서 userid가 모두 같은 숫자를 선택하고 나면 사용자 이름을 보여 주며 id '100'을 가진 usergroup에 수동으로 추가 할 수있다. 그러나 100을 넘으면 매우 오랜 시간이 걸릴 것이다. 그래서 SQL 접근 방식을 시도하고있다. 난 단지 그들의 현재 membergroupids 모두 지우지 않고 자신의 membergroupids에 100을 추가하는 방법을 알아야합니다. 감사합니다 – llw

답변

2

, 당신은 모든,100을 강제로 그 CONCAT()

UPDATE `user` SET `membergroupids` = CONCAT(`membergroupids`, ',100') WHERE... 

를 통해 기존 값에 그것을 연결하여 값을 추가 할 수 있습니다 사용자가 현재 비어있는 경우에도 membergroupids입니다. > 그룹 구성원 적절한 대다 관계, 이에 세 번째로 처리 할 것 - 사용자 <가 이상적으로

UPDATE `users` 
SET `membergroupids` = 
    /* Concatenate ,100 onto the non-empty ones */ 
    CASE WHEN `membergroupids` IS NOT NULL AND `membergoupids` <> '' 
    THEN CONCAT(`membergroupds`, ',100') 
    /* And set the empty ones to just 100 (no comma) */ 
    ELSE '100' 
    END 
WHERE ... 

: 빈들에 대해 설명하기 위해, 당신은 CASE 조건을 사용할 수 있습니다 표는 두 개의 열, 즉 userid, groupid을 갖는 그룹에 사용자를 지정하는 데 사용됩니다.

+0

정말 고마워요. 매력처럼 일했습니다. 115 개의 수동 입력을 저장했습니다. D – llw

1
UPDATE `user` SET `membergroupids`=CONCAT(`membergroupids`, ',100') 
WHERE `userid` IN (...) 

물론 이것은 이미 목록에 하나 이상의 membergroupid가 있다고 가정합니다. 목록이 비어 있으면 '100'을 추가하면 쉼표로 시작하는 목록이 표시됩니다. 일반적으로 바람직하지는 않습니다. 여기에 빠른 해결책이다 :

UPDATE `user` SET `membergroupids`=CONCAT_WS(COALESCE(`membergroupids`, ''), '100') 
WHERE `userid` IN (...) 

또한 무엇 membergroupids의 목록이 너무 오래 성장하고, VARCHAR 열의 길이 제한에 들어갈 수없는 경우 어떻게됩니까? "죄송합니다. 그룹 회원 목록을 저장할 수 없기 때문에 그룹에 가입 할 수 없습니다. 그룹 ID에 대해 더 짧은 값을 가진 그룹에 가입하려는 경우 더 많은 그룹에 가입 할 수 있습니다. "

값 목록을 쉼표로 구분 된 문자열로 저장하는 것은 관계형 데이터베이스에 적합하지 않습니다. 함정에 대한 설명을 참조하십시오. Is storing a delimited list in a database column really that bad?

교차 테이블에 행 당 하나씩 구성원을 저장하면 사용자에 대한 구성원 그룹을 추가하는 것이 더 쉬울 것입니다. 그러면 현재 값 목록을 알 필요가 없습니다.

INSERT INTO user_membergroups (userid, groupid) 
SELECT `userid`, 100 FROM `user` 
WHERE `userid` IN (...) 
+0

나는 빌, 그러나, vBulletin 그들의 데이터베이스를 설정하는 방법에 동의합니다. 슬프게도 하드 코딩 된대로 그것을 변경하려면 많이 할 수 없습니다. 그러나 나는 미래에 문제가되는 것을 볼 수 있기 때문에 membergroupids 필드에 너무 많은 값이있는 경우 어떻게 될지 확실히 물어볼 것입니다. oi – llw

+0

좋아, 내가 추천할만한 앱 목록에서 vBulletin을 건너 뛸 것입니다. :-( –

관련 문제