본문 바로가기
MySql

MySQL은 가장 최근 행에만 가입 하시겠습니까?

by 베이스 공부 2020. 11. 9.
반응형

customer_id, 이메일 및 참조를 저장하는 테이블 customer가 있습니다. 고객에 대한 변경 내역 기록을 저장하는 추가 테이블 customer_data가 있습니다. 즉, 변경 사항이있을 때 새 행이 삽입됩니다.

테이블에 고객 정보를 표시하려면 두 테이블을 조인해야하지만 고객 데이터의 가장 최근 행만 고객 테이블에 조인되어야합니다.

쿼리에 페이지가 매겨져 있으므로 제한과 오프셋이 있다는 점에서 조금 더 복잡해집니다.

MySQL로 어떻게 할 수 있습니까? 어딘가에 DISTINCT를 넣고 싶은 것 같아요 ...

순간의 쿼리는 다음과 같습니다.

SELECT *, CONCAT(title,' ',forename,' ',surname) AS name
FROM customer c
INNER JOIN customer_data d on c.customer_id=d.customer_id
WHERE name LIKE '%Smith%' LIMIT 10, 20

또한 LIKE와 함께 CONCAT을 이런 식으로 사용할 수 있다고 생각하는 것이 맞습니까?

(INNER JOIN이 사용하기에 잘못된 유형의 JOIN 일 수 있다는 점에 감사드립니다. 실제로 서로 다른 JOIN의 차이점이 무엇인지 전혀 알 수 없습니다. 지금 살펴 보겠습니다!)

 

해결 방법

 

다음을 시도해 볼 수 있습니다.

SELECT    CONCAT(title, ' ', forename, ' ', surname) AS name
FROM      customer c
JOIN      (
              SELECT    MAX(id) max_id, customer_id 
              FROM      customer_data 
              GROUP BY  customer_id
          ) c_max ON (c_max.customer_id = c.customer_id)
JOIN      customer_data cd ON (cd.id = c_max.max_id)
WHERE     CONCAT(title, ' ', forename, ' ', surname) LIKE '%Smith%' 
LIMIT     10, 20;

JOIN INNER JOIN 의 동의어 일뿐입니다.

테스트 케이스 :

CREATE TABLE customer (customer_id int);
CREATE TABLE customer_data (
   id int, 
   customer_id int, 
   title varchar(10),
   forename varchar(10),
   surname varchar(10)
);

INSERT INTO customer VALUES (1);
INSERT INTO customer VALUES (2);
INSERT INTO customer VALUES (3);

INSERT INTO customer_data VALUES (1, 1, 'Mr', 'Bobby', 'Smith');
INSERT INTO customer_data VALUES (2, 1, 'Mr', 'Bob', 'Smith');
INSERT INTO customer_data VALUES (3, 2, 'Mr', 'Jane', 'Green');
INSERT INTO customer_data VALUES (4, 2, 'Miss', 'Jane', 'Green');
INSERT INTO customer_data VALUES (5, 3, 'Dr', 'Jack', 'Black');

결과 ( LIMIT WHERE 가없는 쿼리) :

SELECT    CONCAT(title, ' ', forename, ' ', surname) AS name
FROM      customer c
JOIN      (
              SELECT    MAX(id) max_id, customer_id 
              FROM      customer_data 
              GROUP BY  customer_id
          ) c_max ON (c_max.customer_id = c.customer_id)
JOIN      customer_data cd ON (cd.id = c_max.max_id);

+-----------------+
| name            |
+-----------------+
| Mr Bob Smith    |
| Miss Jane Green |
| Dr Jack Black   |
+-----------------+
3 rows in set (0.00 sec)

 

참조 페이지 https://stackoverflow.com/questions/3619030

 

 

반응형

댓글