1

私はテーブル名がadsそのようなものを持っています:

    id    ad_country          ad_gender     ad_birthday
     1     UK                  Male          2012-02-26
     2     sangapor            Female        2011-05-29
     3     UK                  Female        2010-04-12

と私は2つのドロップダウン選択オプションがあります

   one  is to select country

    one is to select year 

結果をアフィンして取得する1つのSQLクエリを作成することは可能ですか?

選択されたすべての国で何人の男性が選択され、年ごとにも選択されました。各国で何人の女性が選ばれた年までにthxも

私はこのSQLを試しましたが、機能しませんでした。

    SELECT COUNT(ad_gender) AS male FROM ads  WHERE '".$_POST['country']."' = ad_country  AND ad_gender = Male AND '".$_POST['year']."' = '".$row2['ye']."'

$row2['ye']は次のように$sql2からのものであることに注意してください

     SELECT ad_birthday,(substr(ad_birthday , 1, 4)) AS ye FROM ads

私が与えたコードはそれほど多くないので、私の投稿を編集しました、ここに私の新しい質問 私の新しい投稿

4

3 に答える 3

4

これを using group byandhavingで行う最も簡単な方法は、クエリで使用することだと思いcaseます。

SELECT  SUM(CASE WHEN ad_gender = 'Male' THEN 1 ELSE 0 END) TotalMale,
        SUM(CASE WHEN ad_gender = 'Female' THEN 1 ELSE 0 END) TotalFemale
FROM    ads
WHERE   ad_country = 'countryHere' AND
        YEAR(DATE(ad_birthday)) = yearHere

SQLFiddle デモ

もう1つ、 SQLインジェクションで脆弱になる可能性があるため、ユーザーからSQLステートメントに値を直接渡さないでください。PDOまたはMYSQLIを使用する

PDO 拡張機能の使用例:

<?php

     $query = "    SELECT   SUM(CASE WHEN ad_gender = 'Male' THEN 1 ELSE 0 END) TotalMale,
                           SUM(CASE WHEN ad_gender = 'Female' THEN 1 ELSE 0 END) TotalFemale
                   FROM     ads
                   WHERE    ad_country = ? AND
                            YEAR(DATE(ad_birthday)) = ?"

    $country = 'UK';
    $year = 2012;
    $dbh = new PDO('mysql:host=localhost;dbname=test;charset=utf8', $user, $pass);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $stmt = $dbh->prepare($query);
    $stmt->bindParam(1, $country);
    $stmt->bindParam(2, $year);
    if ($stmt->execute()) 
    {
         while ($row = $stmt->fetch()) 
         {
              print_r($row);
         }
    }

?>

これにより、一重引用符でレコードを挿入できます。

于 2012-09-12T00:51:20.233 に答える
2

これは非常に単純なクエリで実行できるはずですが、なぜうまくいかないのでしょうか。これまでに何を試しましたか?

select
  ad_country as country,
  YEAR(ad_birthday) as year,
  ad_gender as gender,
  count(id) as count
from ads
where ad_country in ('/* your country params here*/')
group by ad_country, year, ad_gender
having YEAR(ad_birthday) in ('/* your year params here*/')

テーブルから日付部分を取り出すためだけに 2 つ目の SQL クエリを作成する必要はありません。これには、組み込みの SQL 日付と時刻関数を使用してください。

また、これはトピックから外れていますが、投稿したコードはインライン SQL のように見えます。代わりにパラメーター化されたクエリを使用してください。そうしないと、SQL インジェクション攻撃に対して脆弱になります。

于 2012-09-11T21:18:33.663 に答える
2
select ad_country, count(case when ad_gender = 'male' then 1 end) male, 
count(case when ad_gender = 'female' then 1 end) female, year(ad_birthday) year
from ads
group by ad_country, year(ad_birthday)
于 2012-09-11T21:16:37.800 に答える