2015-01-20 4 views
0

저는 MySQL을 처음 사용하기 때문에 다음과 같은 작업을 시도하고 있습니다. 전화를 걸거나 PHP에 저장, 호출, PHP 등에서 저장하는 대신 MySQL 호출에 대한 단일 PHP 쿼리.PHP/MySQL에 SELECT ... INSERT 및/또는 SELECT ... INSERT ... DELETE

내 데이터베이스 설정은 다음과 같습니다. 1. 전자 메일 주소를 포함한 사용자 테이블 2. 이메일 주소와 초대 자의 테이블 3. 초대받은 사람의 테이블 3. '친구'테이블

초대 대상자 테이블과 함께 사용자 테이블에 가입하여 어떤 초대 대상자가 사용자로 등록되었는지 결정합니다. 그들을 초대했습니다. (그들은 1 인 이상 초대되었을 수도 있음을 명심하십시오). 거기서 새로 등록한 초대 된 사람을 친구 테이블에 초대 한 사람과 함께 삽입합니다. 마지막으로 초대 된 테이블에서 초대받은 사람을 삭제하여 초대를받지 않게됩니다.

mysql에 대한 3 가지 별도의 PHP 호출을 사용하여이를 수행하는 방법을 설명합니다. 1. 사용자 테이블과 초대받은 사람 테이블에있는 사용자를 찾는 JOIN (조인은 누가 초대했는지 식별합니다) 2. INSERT 친구 테이블에 쌍을 넣으려면 3. DELETE를 클릭하여 초대 대상자 목록에서 사용자를 제거합니다.

그러나 이것은 트래픽이 많을 것입니다/MySQL 서버에 대한 다중 호출과 덜 최적화 될 것입니다. 또한 다음 MySQL 호출에 정말로 필요한 PHP 스크립트에 저장된 많은 데이터가 있습니다. 나는 이것이 PHP 스크립트에 반환 된 데이터없이 단 한 번의 호출로 가능해야한다는 느낌이 들었다.

INSERT ... SELECT MySQL 호출 (http://dev.mysql.com/doc/refman/5.0/en/insert-select.html)이 있지만 SELECT ... INSERT 옵션이 될 위의 1 단계와 2 단계를 결합하는 방법을 찾을 수 없었습니다. 이것이 존재합니까? 다음과 같은 시도했지만 작동하지 않았다 ... 이런 식으로 내 이상이 될 것입니다.

SELECT users.user as user1, invited2.user as user2, invited2.email as email2 FROM users RIGHT JOIN invited2 ON users.email=invited2.invitee; 
INSERT INTO friends (user, friend) VALUES (user1, user2), (user2, user1); 
DELETE FROM invited2 WHERE invited2.email = email2; 

INSERT INTO 전에 부분은 스스로 작동하지만, 내가 말했듯이, 난 그냥 내 PHP 스크립트에이를 반환하는 경우, 나는 모든 결과를 저장 한 후 자신을 두 번째 전화를해야 만합니다. 한 번의 호출로이 작업을 수행 할 수 있습니까? 그렇다면 삭제 명령문 (DELETE from invited2 WHERE invitee = users.email)을 나중에 처리하는 방법이 있습니까?

모든 조언을 주시면 감사하겠습니다. 미리 감사드립니다.

+0

INSERT .... SELECT와 DELETE 문을 사용하여 저장 프로 시저를 만들 수 있습니다. –

+0

@JayBlanchard의 조언에 감사드립니다. 나는 이것을 백업 계획으로 생각하고 있었지만, 특히 이식성과 데이터베이스 서버로부터의 트래픽을 유지하기 위해 저장된 프로 시저에 대한 리뷰를 들었습니다. 그래서 이것을 피하기를 희망합니다. –

+0

데이터가 관련된 무거운 작업에는 데이터베이스 서버를 사용해야하며 가능한 한 많은 데이터 조작 코드를 PHP 밖으로 유지해야합니다. 저장 프로 시저가 매우 휴대하기 쉽습니다. 나쁜 리뷰를 준 사람은 잘못된 트리를 짖고 있습니다. –

답변

0

의 MySQL은 INSERT를 제공한다 ... SELECT (http://dev.mysql.com/doc/refman/5.1/en/insert-select.html)

귀하의 SQL을 편집 할 수 있습니다 :이 경우

INSERT INTO friends (user, friend) 
SELECT users.user as user1, invited2.user as user2 
FROM users 
RIGHT JOIN invited2 ON users.email=invited2.invitee; 

DELETE invited2 
FROM users 
RIGHT JOIN invited2 ON users.email=invited2.invitee; 

, INNER는 가입 RIGHT 가입보다 더 많은 의미를 보인다.

+0

질문의 'DELETE (삭제)'요구 사항도 해결해주십시오. –

+0

@ Mr.Llama 한번 들여 보내 주셔서 감사합니다. 내 delete 문은 전자 메일 주소가 사용자 테이블의 사용자 전자 메일 주소와 일치하는 피인 (invitee)에서 행을 삭제합니다. –