2016-10-25 5 views
1

私は高度なデータベースクエリを必要とする投票アプリケーションを開発しようとしています。このアプリケーションでは、ユーザーは電話番号を使用して他のユーザーに投票することができます。だから、多くの電話番号を持つユーザーがすべての投票を集計するようにしてください。自分の国のID番号を使用して電話番号を関連付けるテーブルがあります。 |mysql手続き/関数

user_national_idテーブル

user_phone_no:最後に、私はように2つのテーブルを持っていますnational_id
-------------------- | -----------------
のphone1                             | nat_id1
phone2の                            | nat_id1

票テーブル

user_phone_no |送信者
-------------------- | -----------------
のphone1                             | sender1
の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

が出ている問題は、それがで 'national_id'でどのテーブル倍 – user3783697

答えて

0

SQLは通常、あなたがそれら、あなたを必要と考えるとき、(常にではないが)、多くの場合、ループやカーソルなどを必要としません。しないでください。

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の新人によって悪用されるもう1つの機能です。これは、「私のクエリは間違っていますが、何らかの理由でこれを修正するように思われます」というサインです。気軽に、不注意に、または日常的に使用しないでください。特別な正当な理由がなければ使用しないでください。ここでは、正当化が明らかです。

+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