

サブクエリを勉強してます。

■やりたいこと  
売上の平均以上を達成した社員の名前を抽出したい

■分からないこと（迷っていること）  
//売上平均の算出  
//"select avg(sale) from sales";  
//売上の平均以上を達成したsalesテーブルのレコードを抽出  
//select * from sales where sale > (select avg(sale) from sales);

上記まではできました。がsalesのmember_idをもとに売上平均以上の社員名をsql文でどう書けば良いのかわかりません。  
以下のようなsql文を考えましたが、そもそも書き方が間違ってますか？

[code]

    select * from members where member_id = 
      (select member_id from sales where sale > select avg(sale) from sales); 
    
[/code]

■前提条件  
salesテーブル

[code]

    member_id|sale|month
    ---------+----+-----
            1|  75|    4 
            2| 200|    5
            3|  15|    6
            4| 700|    5
            5| 672|    4 
            6|  56|    8
            7| 231|    9
            8| 459|    8
            9|   8|    7
           10| 120|    4
    
[/code]

売上合計：2,536  
売上平均：253.6

membersテーブル

[code]

    member_id|name
    ---------+--------
            1|Tanaka
            2|Sato
            3|Suzuki
            4|Tsuchiya
            5|Yamada
            6|Sasaki
            7|Harada
            8|Takahashi
            9|Nishida
           10|Nakada
    
[/code]

ageテーブル

[code]

    member_id|age
    ---------+--------
            1|24
            2|25
            3|47
            4|55
            5|39
            6|26
            7|43
            8|33
            9|24
           10|20
    
[/code]

■phpコード

[code]

    <?php
    
    require_once('functions.php');
    
    $dbh = connectDb();
    
    $sql = "select * from members where member_id = (select member_id from sales order by sale desc limit 1)";
    $stmt = $dbh->prepare($sql);
    $stmt->execute();
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    //var_dump($rows);
    
    foreach ($rows as $row) {
      echo "1.最大の売上を出した社員の名前：".$row['name']."<br>";
    }
    //var_dump($row['name']);
    
    
    // 2.売上の平均以上を達成した社員の名前の算出方法
    // 売上平均の算出 $sql = "select avg(sale) from sales";
    // 売上の平均以上を達成したsalesテーブルのレコードを抽出 select * from sales where sale >  (select avg(sale) from sales);
    
    
    $sql = "select avg(sale) from sales";
    $stmt = $dbh->prepare($sql);
    $stmt->execute();
    $avg = $stmt->fetchAll(PDO::FETCH_ASSOC);
    var_dump($avg);
    
    
    echo "2.売上の平均以上を達成した社員の名前："."<br>";
    echo "1.30代以下の社員が達成した売上の合計："."<br>";
    
[/code]


CC BY-SA 3.0
2015-11-23T13:38:49.770
19212
2016-04-21T19:40:44.513
2015-11-23T15:40:40.087
5778
7176
question
php mysql
mysqlのサブクエリに関して｜複数のテーブルを使用し条件に合うレコードを抽出したい


サブクエリーの箇所については、できればサブクエリーを使わずに、かつメンテナンスしやすいような形が良いと思いますので、以下のようになるかと思います。

[code]

    SELECT 
      s.member_id ,sale , month , name 
    FROM 
      sales s , 
      members m
    WHERE
      s.member_id = m.member_id
    AND
      s.sale > ( select avg(sale) from sales)
    
[/code]

余談ですが、3番目のageテーブルは今回の質問、副問い合わせの件についてに含まれていませんでしたので不要です。同時に出力するphpコードも不要ではないでしょうか。


CC BY-SA 3.0
2015-11-23T15:58:35.953
19218
2015-11-23T15:58:35.953
5778
19212
answer