2009-09-21 7 views
1

안녕하세요, 저는 mySQL을 처음 사용했습니다. 따라서 언어에 대한 지식이 부족해서 필자가 원하는 결과를 찾지 못할 수도 있습니다.mySQL 데이터를 5 열로 제한 2 열 1 항목 당 2 항목

저는 CodeIgniter에서 Twitter API에 액세스하고 특정 수의 다양한 사용자에 대한 상태 업데이트 테이블을 반환하는 간단한 응용 프로그램을 작성합니다. 저는 이것을 사용자 당 5 개의 업데이트를 보여주는 것으로 제한하고 싶습니다.

본질적으로 실제 데이터베이스의 축소 버전 인 다음 데이터베이스가 있다고 가정 해보십시오.

person picture update 
john  pic 1  lorem ipsum 
john  pic 1  lorem ipsum 
john  pic 1  lorem ipsum 
john  pic 1  lorem ipsum 
john  pic 1  lorem ipsum 
jim  pic 2  lorem ipsum 
jim  pic 2  lorem ipsum 
jim  pic 2  lorem ipsum 
jim  pic 2  lorem ipsum 
jim  pic 2  lorem ipsum 
joe  pic 3  lorem ipsum 
joe  pic 3  lorem ipsum 
joe  pic 3  lorem ipsum 
joe  pic 3  lorem ipsum 
joe  pic 3  lorem ipsum 
steve pic 4  lorem ipsum 
steve pic 4  lorem ipsum 
steve pic 4  lorem ipsum 
steve pic 4  lorem ipsum 

내가하고 싶은 것은 SQL 쿼리를 사용하여 데이터베이스로가는 도중에 한 사람당 업데이트 수를 제한하는 것입니다.

내 검색어에 INSERT IGNORE를 사용하고 있습니다. 페이지를 새로 고칠 때마다 중복 항목이 삽입되는 것을 원치 않지만 단순히 전체 사용자에 대해 LIMIT 5 한도를 추가하는 것이 좋습니다. 나는 사용자 당 5 명으로 제한하고 싶다.

이 작업을 수행하는 간단한 방법이 있습니까? 교체할까요? 최신 정보? 하위 쿼리?

도움을 주셔서 감사합니다.

답변

0

가장 쉬운 방법은 INSERT의 트리거 일 수 있습니다.

이렇게하면 응용 프로그램 논리가 필요한 경우 INSERT를 처리 할 수 ​​있습니다.

트리거 로직은 새 레코드를 삽입하기 전에 가장 최근의 (또는 원하는 기준에 따라) 4 개를 제외한 모든 레코드를 삭제합니다.

그런 일이 될 수있다 : (참고 :. 중첩 된 쿼리에 LIMIT의 clasue에 대한 검증되지 않은 + 문제, 필요하다면 다른 트릭을 찾을 수)

이 조각은 id 필드를 사용할 것이라고 가정한다. 그러한 필드는 OP의 쓰기에 표시되지 않지만 많은 의미가 있습니다. PK는 CRUD 작업을 훨씬 쉽게 만듭니다 (복합 키의 철자를 작성하는 대신 여기에 3 개의 필드가 있습니다 ...). 트리거는 대신 AFTER INSERT로 작성 될 수 있으며, 이는 새 레코드가 중복 된 경우 불필요하게 일부 레코드를 삭제할 가능성을 피할 수 있습니다.

CREATE TRIGGER LimitTweetUpdates BEFORE INSERT ON myTweeterTable 
    FOR EACH ROW BEGIN 
    DELETE FROM myTweeterTable 
    WHERE person = NEW.person 
    AND id NOT IN 
     (SELECT id FROM myTweeterTable 
     WHERE person = NEW.person 
     ORDER BY id DESC 
     LIMIT 5) 
    END; 
+0

감사합니다. 나는 실제로 당신의 코멘트 후에 트리거에 대해 배우러 갔고 편집하기 직전에 "AND id not IN"까지 모든 것을 생각해 내었습니다. 이 두 번째 부분이 필요합니까? 트리거가 없으면 트리거가 데이터베이스의 모든 항목을 삭제 한 다음 새 쿼리를 실행하겠습니까? –

+0

@ Joshua : 실제로 "AND id NOT IN ..."을 제거하면 트리거가이 사람에 대해 _3 개의 myTweeterTable 행을 삭제합니다. 좋은 일이 아닙니다 ;-) – mjv

+0

ID PK가 없으므로 INSERT IGNORE가 효과적이지 않습니다. INSERT IGNORE와 일치하는 특정 열에 집중할 수 있는지 잘 모르겠지만 ID와 다른 열 모두에서 PK를 시도하면 무시가 실패합니다. –

관련 문제