2016-10-31 8 views
0

ここがシナリオです。私はさまざまなレベルのユーザーを持っています。 admin - > reseller - > marketing - > autoserviceMySQL - メンバーによって作られたメンバーを選択する

特定の再販業者が作成したすべての自動サービスを選択するSQLクエリを作成しようとしています。 autoservice1、autoservice2、autoservice3、autoservice4、autoservice5、autoservice6とそのすべてのフィールドを選択する必要があり

+----+--------+--------------+-------------+-----------+ 
| id | userid | username  | role  | createdby | 
+----+--------+--------------+-------------+-----------+ 
| 1 | 334455 | reseller1 | reseller | admin  | 
| 2 | 245578 | marketer1 | marketer | reseller1 | 
| 3 | 235677 | autoservice1 | autoservice | marketer1 | 
| 4 | 253569 | autoservice2 | autoservice | marketer1 | 
| 5 | 234267 | autoservice3 | autoservice | marketer1 | 
| 6 | 245468 | marketer2 | marketer | reseller1 | 
| 5 | 434567 | autoservice4 | autoservice | marketer2 | 
| 5 | 532263 | autoservice5 | autoservice | marketer2 | 
| 5 | 634262 | autoservice6 | autoservice | marketer2 | 
+----+--------+--------------+-------------+-----------+ 

クエリ:すべてのユーザは、次の簡単な構造を持っているユーザーテーブルに保存されています。私は現在、MySQLとphpの組み合わせでこれをやっています。最初に私はreseller1によって作成されたすべてのマーケティング担当者を選択します。

$sql="SELECT * FROM marketers WHERE createdby=:createdby"; 
$st=$conn->prepare($sql); 
$st->bindvalue(":createdby",'reseller1',PDO::PARAM_STR); 
$st->execute(); 
$usersArray=$st->fetchAll(); 
$NumberOfusers=$st->rowcount(); 

は、その後の結果を通してIループ:

$MembersGeoData=array(); 
$MembersCount=0; 
for($i=0;$i<$NumberOfusers;$i++) { 
    $sql="SELECT * FROM autoservices WHERE createdby=:createdby"; 
    $st=$conn->prepare($sql); 
    $st->bindvalue(":createdby",$usersArray[$i]['username'],PDO::PARAM_STR); 
    $st->execute(); 
    $tempUsersArray=$st->fetchAll(); 
    $tempNumberOfusers=$st->rowcount(); 
    $MembersGeoData=array_merge($MembersGeoData,$tempUsersArray); 
    $MembersCount+=$tempNumberOfusers; 
} 

これは動作しますが、非常に非効率的であると思われます。どのように私はこの1つのSQLクエリでこれを行うことができますか?

+0

あなたがテーブルの概略を追加してくださいことはできますか? 'マーケティング担当者 'と'オートサービス'という2つのテーブルがありますか?もしそうなら、 'createdby'フィールドに_marketer_のIDを使わないのはなぜですか? – EhsanT

答えて

0

私は@Gordon Linoffからの回答を使用して私の質問に答え:

SELECT a.* FROM autoservices AS a 
JOIN marketers AS m 
ON a.createdby=m.username 
WHERE m.createdby='reseller1' 
1

はその後、(それがスキップされることはありませんし、マーケティング担当者が他のマーケティング担当者を作成することはありません)あなたの階層が正確に正しいと仮定すると:

select sa.* 
from autoservices sm join 
    autoservices sa 
    on sa.role = 'autoservice' and 
     sm.role = 'marketer' and 
     sm.username = sa.createdBy 
where sm.createdBy = 'reseller1'; 

あなたが正しいです。あなたはデータベースにこの作業をさせるべきです。

+0

私はSQLでうまくいかない。 smとsaは何ですか?彼らはエイリアスですか?もしそうなら、 "as"キーワードを使用すべきではありませんか?多分私は間違っています。 – MehdiB

+0

@MehdiBagheriあなたが推測したように、彼らはエイリアスであり、あなたがそれらのために選んだ名前は関係ありません。あなたはそれらのために何かを使用することができますが、それはあなたに合った名前を使用する方が良いです... – EhsanT

+0

@MehdiBagheri。 。 。お互いに隣り合う2つの "名前"が誤解を招く可能性があるため、私は常に列の別名として 'as'を使います。 'as 'は何も追加しないので、テーブルエイリアスに対しては使用しません。 –

関連する問題