2016-10-25 2 views
1

고급 데이터베이스 쿼리가 필요한 투표 애플리케이션을 개발하려고합니다. 이 응용 프로그램은 사용자가 전화 번호를 사용하여 다른 사용자에게 투표하도록 허용합니다. 따라서 많은 전화 번호를 가진 사용자가 전체 투표 수를 합산하도록하십시오. 나는 전화 번호를 국가 ID 번호로 연결하는 테이블을 가지고 있습니다. |mysql 프로 시저/함수

user_national_id 테이블

user_phone_no : 결국 나는 그래서 두 개의 테이블이 national_id
-------------------- | -----------------
PHONE1                             | nat_id1
phone2                             | nat_id1

표 테이블

user_phone_no | 보낸 사람
-------------------- | -----------------
PHONE1                             | 발신자에게
PHONE1                             | sender2
phone2                             | sender3
phone2                             | sender2

이제는 user_national_id 테이블에서 고유 한 국가 ID 번호를 수집하고 user_national_id 테이블의 사용자 전화 번호에 국가 ID를 연결 한 다음 반환 된 전화 번호가 투표 테이블에 나타나는 횟수를 계산해야합니다.

미리 감사드립니다.

(의견에서 이동 함 ...)

DELIMITER $$ 
    CREATE PROCEDURE GetUniqueNominees() 
    BEGIN DECLARE done BOOLEAN; 
    DECLARE nomIds VARCHAR(255); 
    DECLARE curIds CURSOR FOR 
     SELECT DISTINCT national_id 
      FROM user_national_id; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE; 
    OPEN curIds; 
    LOOPROWS: LOOP 
     IF done=TRUE THEN 
     CLOSE curIds; 
     LEAVE LOOPROWS; 
     END IF; 
     FETCH curIds 
     INTO nomIds; 
     SELECT DISTINCT nomIds; 
     select count(user_phone_no) 
     from votes 
     inner join user_national_id 
      ON (votes.user_phone_no = user_national_id.user_phone_no) 
     where national_id=nomIds; 
    END LOOP; 
    END$$ 
DELIMITER ; 
+0

@mmushtaq Sql에서 좋지는 않지만 분명히 작동하지 않는 조인을 시도했습니다. – user3783697

+0

이것은 내가 지금까지 생각해 낸 것입니다. – user3783697

+0

각 결과를 두 번 반환한다는 것은 어떤 것입니까 – user3783697

답변

0

SQL은 일반적으로 당신은 당신이 그들을 당신을 필요가 있다고 생각하면, (항상은 아니지만) 자주 루프와 커서 등을 필요로하지 않는다 하지마.

SQL은 절차적인 것이 아니며 선언적으로 작성되었습니다. 서버가 원하는 방식으로 서버에 알려줍니다. 그러면 서버 (쿼리 최적화 프로그램)는 논리적으로 사용자가 묻는 것과 일치하는 한 결과를 계산하기 위해 생각할 수있는 논리를 자유롭게 구현할 수 있습니다. 이 경우

이 여기에 당신이 묻는 것 같다 무엇을 표현하는 방법 :

SELECT u1.national_id, COUNT(DISTINCT v.sender) AS votes_counted 
    FROM user_national_id u1 
    JOIN user_national_id u2 ON u2.national_id = u1.national_id 
    JOIN votes v ON v.user_phone_no = u2.user_phone_no 
WHERE u1.user_phone_no = ? 
GROUP BY u1.national_id 

을 여기에, 우리는 U1과 U2로의 별명 user_national_id 테이블의 두 개의 "가상 복사본"을 사용합니다. 입력 된 전화 번호는 u1에 있으며 사용자의 국가 ID입니다. 그로부터 우리는 u2에서 동일한 국가 ID를 찾았습니다. 사용자의 전화 번호는 모두이며 여기에서 우리는 u2에서 찾은 전화 번호와 일치하는 모든 전화 번호에 대해 (발신자 수를 세어) 투표 수를 계산합니다 u1의 기준에 따라 현재 구조가 사용자의 다른 전화 번호에 투표하도록 허용하는 것으로 보이기 때문에 중복 투표를 삭제하는 DISTINCT 발신자를 계산하지만, 나는 무시당하는 것으로 간주합니다. 그렇지 않은 경우 DISTINCT을 삭제하십시오.

DISTINCT은 SQL 초보자가 일반적으로 남용하는 또 다른 기능으로, "내 쿼리가 잘못되었지만 어떤 이유로이 문제를 해결하는 것"이라는 표시입니다. 아무렇지도 않게, 부주의하게, 또는 일상적으로 사용하지 마십시오. 특별한 정당성없이 사용하지 마십시오. 여기에서 정당화가 명백해 보인다.

+0

** 굉장한 물건! 매력처럼 보임 ** – user3783697

+0

우수 뉴스, @ user3783697. 허용 된 것으로 표시하는 것을 잊지 마십시오. –

0

험 내가 잘 이해한다면 그것은해야한다 :

select count(sender) from votes inner join user_national on (votes.user_phone_no = user_national.user_phone_no) where national_id = {yourValueHere} 
+0

당신은 이미 국가 ID 번호를 알고있을 때 정말 작동합니다. – user3783697

+0

내 문제는 결과를 통해 고유 한 국가 ID 루프를 가져오고 수행 한대로 계산합니다. 그래서 국가 ID가 동적으로 제공됩니다. – user3783697