메모 관리에 문제가 있습니다. 나는 항상 INSERT
새로운 노트와 SELECT
마지막 노트에 대한 전략으로 시작했습니다 . 웃지 마세요. 좋은 아이디어라고 생각했을 것입니다.하지만 지금은 시스템이 전면 생산되지도 않았고 약 한 달 동안 30 만 행이 삽입되었습니다. 2 년 후에 내 시스템이 실패합니다. 중복 된 줄을 병합해야합니다. 내 notes
테이블 의 구조는 다음과 같습니다 .
CREATE TABLE IF NOT EXISTS `ps_notes` (
`CodeNTE` int(11) NOT NULL AUTO_INCREMENT,
`CodePRS` int(11) NOT NULL,
`CodeXYZ` int(11) NOT NULL,
`Type` char(3) NOT NULL,
`Focus` char(3) NOT NULL,
`Texte` tinytext NOT NULL,
`Date` datetime NOT NULL,
PRIMARY KEY (`CodeNTE`),
KEY `CodeXYZ` (`CodeXYZ`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=335068 ;
참고 사람과 관련이있을 수 있습니다 CodePRS
, 반드시 관련되어 Type
, Focus
하고 CodeXYZ
. 그들은 Texte
항목이 있고 언젠가 나는 Date
.
CodeXYZ
메모가 첨부 된 엔티티의 고유 식별자입니다. 이 식별자는 모든 테이블에서 가져올 수 있으므로 절대적으로 고유하지 않으므로 Type
필드 가 제공됩니다 . 이 필드는 상위 행이 나오는 테이블을 지정합니다. 이 focus
필드는 동일한 CodeXYZ
및 Type
.
다음은 몇 가지 샘플 라인입니다.
+ --------- + ------ + ------- + ------------- + ---------- -+ | CodeXYZ | 유형 | 초점 | Texte | 날짜 | + --------- + ------ + ------- + ------------- + ---------- -+ | 30008 | 클릭률 | adm | 뭐든 | 2013 년 5 월 9 일 | | 30008 | 클릭률 | adm | 뭐든 | 2013 년 6 월 10 일 | | 30008 | 클릭률 | adm | Lorem ipsum | 2013-06-11 | | 30008 | 클릭률 | clt | 그는 멋지다 | 0000-00-00 | | 2546 | 클릭률 | sup | 다른 | 2013-02-11 | | 2546 | 클릭률 | sup | 다른 | 2013-02-11 | | 2546 | 클릭률 | sup | 다른 | 2013 년 2 월 19 일 | + --------- + ------ + ------- + ------------- + ---------- -+
이것은 내가 갖고 싶은 출력입니다.
+---------+------+-------+-------------+-----------------------------------------+
| CodeXYZ | Type | Focus | Texte | Date |
+---------+------+-------+-------------+-----------------------------------------+
| 30008 | ctr | adm | Lorem ipsum | 2013-06-11 (I want the most recent one) |
| 30008 | ctr | clt | He's cool | 0000-00-00 |
| 2546 | ctr | sup | Another | 2013-02-11 |
| 2546 | ctr | sup | Another | 2013-02-19 |
+---------+------+-------+-------------+-----------------------------------------+
병합 조건
CodeXYZ
, Type
그리고 Focus
때 Focus
'SUP'는 아니다.Focus
'저녁을 먹다'는 내가 같은이 선을 병합 할 CodeXYZ
, Type
, Focus
및Date
그래서이 쿼리를 실행하여 임시 테이블의 행을 병합했습니다.
INSERT INTO notes_tmp (CodePRS,CodeXYZ,Type,Focus,Texte,Date)
SELECT CodePRS,CodeXYZ,Type,Focus,Texte,Date
FROM notes
GROUP BY CodeXYZ,Type,Focus
그러나 그렇게하면 모든 줄이 마지막 줄까지 병합됩니다.
그래서 나는 이것을 생각했습니다.
INSERT INTO notes_tmp (CodePRS,CodeXYZ,Type,Focus,Texte,Date)
SELECT CodePRS,CodeXYZ,Type,Focus,Texte,Date
FROM notes
WHERE Focus<>'sup'
GROUP BY CodeXYZ,Type,Focus
ORDER BY Date DESC
UNION
SELECT CodePRS,CodeXYZ,Type,Focus,Texte,Date
FROM notes
WHERE Focus='sup'
GROUP BY CodeXYZ,Type,Focus,Date
ORDER BY Date DESC
하지만 UNION은 올바른 위치에 있지 않습니다. INSERT INTO ... SELECT
SQL 구문 에서 사용할 수 없다고 생각 합니다.
별도의 조건에 따라 동일한 테이블에서 끝나는 여러 하위 쿼리를 사용하여 단일 mysql 호출에서 해당 줄을 복사하는 것을 관리하는 방법이 있습니까?
그래서 @Volkan 답변의 일부로 GROUP_CONCAT ()에서 올바른 메모를 얻기 위해 어떻게 든 이상하게 작동하는 SQL을 생각해 낼 수 있습니다.
케이스는 그룹 concat의 마지막 항목을 가져옵니다. 텍스트에서 쉼표가 자주 발생하기 때문에 다른 구분 기호 (,,,)를 사용했습니다. 3 연속으로 조금 적습니다.
INSERT INTO notes_temp
SELECT CodeXYZ,Type, Focus,Texte,Date
FROM notes WHERE Focus = 'sup'
GROUP BY CodeXYZ,Type, Focus,Date;
INSERT INTO notes_temp
SELECT
CodeXYZ,
Type,
Focus,
CASE
WHEN COUNT(Texte) > 1
THEN SUBSTR(GROUP_CONCAT(Texte SEPARATOR ",,,"),((LENGTH(GROUP_CONCAT(Texte SEPARATOR ",,,"))+2) - INSTR(REVERSE(GROUP_CONCAT(Texte SEPARATOR ",,,")),",,,")))
ELSE
Texte
END
AS Texte,
MAX(Date)
FROM notes WHERE Focus <> 'sup'
GROUP BY CodeXYZ,Type, Focus;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다