2010-07-22 2 views
2

난 그냥 함께 (모든 행을 삭제하고 계속 최신 X는

entryid, roomid 
1   1  
2   55 
3   1 
4   12 
5   1 
6   44 
7   1 
8   3 
9   1 

같은 테이블이 지금은 roomid = 1 roomid의 최신 3 = 1 왼쪽을 유지 모든 항목을 삭제하려면 가장이 왼쪽 하나 개의 명령) 그래서 마지막으로 ENTRYID

: 도움을 감사 : 1 & 3 구가 여전히 남아있을 것입니다 확실히 다른 모든 roomid)

편집을 위해 (체재 유지, 삭제, 7, 6 ENTRYID왔다. 아래 모든 사용자가 내 자신의 솔루션을 추가했습니다.

나는 이것을 하나의 명령으로 가져 오는 방법을 new Question 시작했습니다. 너는 나를 도울지도 모른다. 작동 할 수

delete from TABLE 
where roomid=1 
    and entryid not in 
    (select entryid from TABLE where roomid=1 order by entryid desc limit 0, 3) 

같은

+0

yikes와 같이 형식을 수정하고 정교하게 질문을 작성하십시오. – Fosco

+0

왜 이것이 하나의 명령 일 필요가 있습니까? 나는 둘을 쓸거야. –

+0

이제 2를 사용합니다. 지금까지 두 가지 쿼리로 작업합니다. $ sql_com = "SELECT id FROM'mytable' where roomid = '3'ORDER BY id DESC LIMIT 10,1"; \t \t $ row = mysql_fetch_array ($ result, MYSQL_NUM); $ sql_com = "DELETE FROM'mytable' WHERE id <". $ row [0]; 하지만 어쩌면 하나의 명령으로 더 잘 수행 될 수 있습니다. –

답변

2

DELETEORDER BYLIMIT 절을 지원, 그래서 가능합니다. 그러나 LIMITDELETE의 참조 제한 및 매개 변수로 인해 두 개의 쿼리가 필요합니다.

SELECT COUNT(*) AS total FROM table WHERE roomid = 1; 
-- run only if count is > 3 
DELETE FROM table WHERE roomid = 1 LIMIT total - 3; 

중간 기술이 필요합니다. 참조 용 쿼리를 표시했습니다.

+0

흥미로운 접근 방식이지만 MySQL이 '제한'이후에 변수를 허용한다고 생각하지 않습니다. 동적 SQL 문을 작성해야합니다. – Andomar

+0

@Andomar 분명히, 필자가 지적했듯이, 이것은 2 쿼리 접근법을 강조하기위한 의사 SQL입니다. 동적 쿼리를 생성하는 데 도움이되는 기술 (예 : PHP)이 필요합니다. –

+0

내가 두 쿼리 지금까지 작업 : // 그 방에서 이전 댓글을 삭제> (100) \t \t $ sql_com = "FROM ID를 선택'mytable' WHERE roomid = '3'순서 아이디 DESC의 LIMIT 10,1 BY" ; \t \t \t if ($ result = mysql_query ($ sql_com)) {} else {echo ('데이터베이스 SELECT ERROR', mysql_error());}; \t \t \t \t $ row = mysql_fetch_array ($ result, MYSQL_NUM); \t \t \t \t $ sql_com = "DELETE FROM mytable' WHERE id <". $ row [0]; \t \t if ($ result = mysql_query ($ sql_com)) {} else {echo ('데이터베이스 SELECT ERROR', mysql_error());}; \t \t 어쩌면 한 명령으로 더 잘 수행 될 수 있습니다. –

0

뭔가.

+0

mysql에서 작동하지 않으며 테이블에서 레코드를 삭제할 위치를 참조 할 수 없습니다.2 개의 쿼리가 필요합니다 – burnall

+1

ERROR 1093 : FROM 절의 업데이트를 위해 'TABLE'대상 테이블을 지정할 수 없습니다. – Andomar

1

당신은 그 기반으로 임시 테이블에서 불필요한 객실의 ID를 저장하고 삭제할 수 있습니다

create temporary table tmpTable (id int); 

insert tmpTable 
     (id) 
select id 
from YourTable yt 
where roomid = 1 
     and 3 <= 
     (
     select count(*) 
     from YourTable yt2 
     where yt2.roomid = yt.roomid 
       and yt2.id > yt.id 
     ); 

delete 
from YourTable 
where ID in (select id from tmpTable);  

이 결과 :

ID roomid 
2 55 
4 12 
5 44 
6 1 
7 1 
8 3 
9 1 
+1

+1 : deja vu와 같은 느낌 ... –

+0

MySQL이 유일한 기술인 경우 좋네요. 그러나 IMO, 뭔가 다른 것이 있으면 잔인 할 것입니다. –

+0

고맙지 만 .. 내 견해로는 큰 데이터베이스가 있다면 너무 많은 리소스가 필요합니다. –

0

여기에 T-SQL 사람,하지만-SQL에서 t 수는 수행

SELECT 
    * 
FROM 
    TABLE A 

    LEFT JOIN (SELECT TOP 3 entryID FROM TABLE WHERE roomID = 1 ORDER BY entryID DESC) B 
    ON A.entryID = B.entryID 
WHERE  
    A.roomID = 1 AND 
    B.entryID IS NULL 

그런 다음에서 삭제 표와 선택 교체 ...

? 모든 도움말

+0

나는 T-SQL이 MySQL이 허용하는 것보다 훨씬 강력하다는 점을 두려워하고 있습니다. 그러면'ERROR 1093 : 목표 테이블을 지정할 수 없습니다 '라는 오류가 발생합니다.'FROM 절의 업데이트에 대한 TABLE '오류 – Andomar

1
SET @deleting = (SELECT COUNT(*) FROM tbl WHERE roomid = 1) - 3; 
-- run only if @deleting is > 0 
PREPARE stmt FROM 'DELETE FROM tbl WHERE roomid = 1 ORDER BY entryid LIMIT ?'; 
EXECUTE stmt USING @deleting; 
0

덕분에 .. 나는 모두 함께했고,이 단계가 닫혀 나를 위해 지금이 솔루션 :) 를 사용합니다. 감사.

// Delete older comments from room 1 (keep last 3 left) 
// Step 1: 
$sql_com = "SELECT id FROM `mytable` WHERE roomid = '1'"; 
$result = mysql_query ($sql_com); $num_rows = mysql_num_rows($result);  

// Step 2: 
if ($num_rows > 3) { 
    $sql_com = "SELECT id FROM `mytable` WHERE roomid = '1' ORDER BY id DESC LIMIT 3,1"; 
    $result = mysql_query ($sql_com); 
    $row = mysql_fetch_array($result, MYSQL_NUM); 
} 

// Step 3: 
$sql_com = "DELETE FROM `mytable` WHERE roomid = '1' AND id < ".$row[0]; 
$result = mysql_query ($sql_com); 
관련 문제