본문 바로가기
MySql

MySQL : WHERE 절에서 여러 쌍으로 SELECT 행을 대량으로 만드는 방법

by 베이스 공부 2021. 1. 20.
반응형

다음과 같은 email_phone_notes 테이블이 있다고 가정 해 보겠습니다.

+-----------------------+--------------+------+-----+---------+-------+
| Field                 | Type         | Null | Key | Default | Extra |
+-----------------------+--------------+------+-----+---------+-------+
| email                 | varchar      | NO   | PRI | NULL    |       |
| phone                 | varchar      | NO   | PRI | NULL    |       |
| notes                 | text         | NO   |     | 0       |       |
+-----------------------+--------------+------+-----+---------+-------+

따라서 각 이메일 / 전화 조합은 고유하지만 전화 번호가 다른 여러 이메일 주소를 가질 수 있으며 그 반대의 경우도 마찬가지입니다. 이것은 약간 인위적이지만 내 시나리오를 반영합니다.

다음과 같은 쿼리를 수행하고 싶습니다.

SELECT * FROM email_phone_notes  WHERE email = 'foo@bar.com' AND phone = '555-1212';

하지만 한 번에 여러 쌍을 수행하고 싶으므로 여러 SELECT 쿼리를 만들 필요가 없습니다. 요청하지 않은 잘못된 전화 / 이메일 조합을 반환하고 싶지 않기 때문에 쌍을 함께 유지하는 것도 중요합니다.

이런 식으로 할 수는 있지만 수백 개의 값이있을 수 있으므로 쿼리가 정말 길어질 것입니다.

SELECT * FROM email_phone_notes WHERE ( 
  (email='foo@bar.com' && phone='555-1212') || 
  (email='test@test.com' && phone='888-1212') || 
   ...

더 우아한 해결책이 있습니까, 아니면 이것을 고수해야합니까? 감사!

 

해결 방법

 

우아한 SQL을 원한다면 행 생성자를 사용할 수 있습니다.

SELECT * FROM email_phone_notes WHERE (email, phone) IN (
  ('foo@bar.com'  , '555-1212'),
  ('test@test.com', '888-1212')
  -- etc.
);

그러나 이는 색인 친화적이지 않으며 중요한 크기의 테이블에는 권장되지 않습니다. 대신 원하는 쌍으로 테이블을 구체화하고 테이블과 조인 할 수 있습니다.

SELECT * FROM email_phone_notes NATURAL JOIN (
  SELECT 'foo@bar.com' AS email, '555-1212' AS phone
UNION ALL
  SELECT 'test@test.com', '888-1212'
-- etc.
) t;

또는 (임시) 테이블을 미리 채 웁니다.

CREATE TEMPORARY TABLE foo (PRIMARY KEY (email, phone)) Engine=MEMORY
  SELECT email, phone FROM email_phone_notes WHERE FALSE
;

INSERT INTO foo
  (email, phone)
VALUES
  ('foo@bar.com'  , '555-1212'),
  ('test@test.com', '888-1212')
  -- etc.
;

SELECT * FROM email_phone_notes NATURAL JOIN foo;

 

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

 

 

반응형

댓글