내 질문에 여러 번 답변을 받았지만이 작업을 수행 할 수 없습니다.
항목이 업데이트되었는지 여부를 고려하면서 중복 식별자가있는 모든 항목 ID를 얻으려고합니다.
이것이 아이템 데이터를 보관하는 메인 테이블이라고 가정 해 봅시다.
========================== item_table =========================
+----------+---------------+---------+------------+-----------+
| store_id | store_item_id | item_id | identifier | update_id |
+----------+---------------+---------+------------+-----------+
|1 | 1:1 | 1 | abc1 | 1 |
|1 | 1:2 | 2 | abc2 | NULL |
|1 | 1:3 | 3 | abc3 | NULL |
|1 | 1:4 | 4 | abc1 | 2 |
|1 | 1:5 | 5 | abc1 | NULL |
|1 | 1:6 | 6 | NULL | 3 |
|1 | 1:7 | 7 | | NULL |
|1 | 1:8 | 8 | abc1 | NULL |
|2 | 2:9 | 9 | abc1 | NULL |
+----------+---------------+---------+------------+-----------+
그리고 업데이트 된 항목에 대한 업데이 트 테이블 (여기서 id
경기 update_id
에서 item_table
)
업데이트 테이블은 항목 데이터를 덮어 쓰며 정의 된 경우 원래 항목 데이터 대신 사용됩니다.
===== update_table =====
+---------+------------+
| id | identifier |
+---------+------------+
| 1 | abc0 |
| 2 | abc4 |
| 3 | abc1 |
+---------+------------+
identifier
NULL 또는 빈 문자열이 아닌지 확인하십시오.store_id
item_id
경우 만 선택하십시오 identifier
(예 : i.store_item_id <> g.store_item_id
동일한 항목인지 확인).위의 제약 조건으로 원래 항목 데이터를 확인하는 다음 쿼리가 있지만 업데이트 된 값도 확인할 수 없습니다.
SELECT
g.item_id
FROM
item_table g
WHERE g.store_id = 1 AND EXISTS (
SELECT
i.identifier
FROM
item_table i
WHERE
i.identifier = g.identifier AND
i.identifier <> '' AND
i.identifier IS NOT NULL AND
i.store_item_id <> g.store_item_id AND
i.store_id = 1
)
+---------+
| item_id |
+---------+
| 1 |
| 4 |
| 5 |
| 8 |
+---------+
그러나 정의 된 경우 최종 데이터가되고 내 쿼리가 반환해야하는 내용은 업데이트 테이블을 확인해야합니다.
나는 모든 필요한 item_id
곳의 store_id
1과 동일한 식별자 (예를 가지고있다 abc1
당좌) update_table
뿐만 아니라를
+---------+
| item_id |
+---------+
| 5 |
| 6 |
| 8 |
+---------+
나는 모든 종류의 시도로 돌아가 그와 같은 작업 JOINS
, IFNULL
사용하는 다른 방법 EXISTS
또는 사용 GROUP BY
으로 HAVING
,하지만 주로 나는이 있기 때문에 작업을 얻을 수 update_id
항상 정의되어 있지 않습니다. 어떤 아이디어?
duplicates
제 경우에는 식별자가 모든 항목에 대해 고유해야 함을 의미합니다. 그렇다고 DB에 삽입 할 수 없다는 의미가 아니라 이슈를 수집하고 사용자에게 보여 주면 데이터를 업데이트하고 수정할 수 있습니다.SELECT item_id
FROM (
SELECT store_id, item_id, COALESCE(u.`identifier`, i.`identifier`) as `identifier`
FROM item_table i
LEFT JOIN update_table u
ON i.`update_id` = u.`id`
) as updated
JOIN (
SELECT store_id, COALESCE(u.`identifier`, i.`identifier`) as `identifier`, COUNT(*)
FROM item_table i
LEFT JOIN update_table u
ON i.`update_id` = u.`id`
GROUP BY store_id, COALESCE(u.`identifier`, i.`identifier`)
HAVING COUNT(*) > 1
) as duplicated
ON updated.`store_id` = duplicated.`store_id`
AND updated.`identifier` = duplicated.`identifier`
WHERE updated.`identifier` <> ''
AND updated.`identifier` IS NOT NULL
ORDER BY item_id;
산출
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다