0

データベースに 2 つのテーブルがあります

table: products                   table: companies
+-----------+------------+        +------+------------+
| name      | company_id |        | id   | name       |
+-----------+------------+        +------+------------+
|Product 1  | 1          |        | 1    | Company 1  |
|Product 2  | 1          |        | 2    | Company 2  |   
|Product 3  | 3          |        | 3    | Company 3  |
|Product 4  | 1          |        | 4    | Company 4  |
|Product 5  | 1          |        | ...               |
|Product 6  | 3          |        +------+------------+
|Product 7  | 2          |
|...                     |
+-----------+------------+

ここで、テーブルのすべての会社の名前とリストの会社名の後の製品の名前を持つ HTML 要素を使用して、会社セレクター(会社ごとに製品をフィルタリングする) を作成する必要があります。SELECTcompaniesCOUNT

したがって、私の目標はSELECT次のようなオプションを取得することです。

  • 会社1 (4)
  • 会社 2 (1)
  • 会社 3 (2)
  • 会社 4 (0)

(注: 括弧内のカウントは上記の例からのものです)

これまでに何を試しましたか?

mysql_*以前は関数を使用していましたが、その後はmysqli手続き型モデルでした。whileこれは、会社の 1 つのクエリとブロック内の別のクエリを使用して手動で行うことができCOUNT、要素を取得します (ループ内の現在の会社の ID によってフィルター処理されます)。今、私はこれに取り組もうとしていますが、PDO objectこれは私にとって新しいことであり、あまり慣れていません。

質問

COUNT1つのクエリで(JOINsまたは何かを使用して)取得することは何とか可能ですか?$dbPDOそうでない場合、オブジェクトを使用してループ内でクエリを実行するにはどうすればよいですか (古い方法) 。それとも他の方法ですか?

ここでいくつかの例を見てきましたが、私の要件に適合するものは何もありませんでした。何かを見逃したのかもしれませんが、PDO を扱うのはまだ苦痛です (できるだけ早く学ばなければなりません)。

私自身の質問を見ると、難しいことではないと思いますが、最悪の場合、自分で解決策を見つけることができません

最後に、私は に解決策を持っていますがmysqli、私はそれがあまり好きではなく、このタスクを実行する簡単な方法があると思います!

この質問は私が必要としているものだと思いましたが、答えのクエリをまだ理解していません。

これまでのところ、私はこのコードを持っていますが、製品をカウントする方法がわかりません:

  $dbPDO = new PDO('mysql:dbname=comixdb;host=localhost', 'root', '');
  $sel_cat = ''; # selector HTML
  $sql = "SELECT * FROM categories ORDER BY name";
  foreach ($dbPDO->query($sql) as $row) {
    $sel_cat .= "<option value=\"{$row['id']}\">{$row['name']}</option>";
    }
  $sel_cat = "<select><option value=\"*\">All categories</option>$sel_cat</select>";

  echo $sel_cat;

質問が十分に明確になったことを願っています。どんな助けでも大歓迎です。

4

1 に答える 1

2

必要なことは SQL で実行できます。

SELECT companies.name, SUM(IF(company_id IS NULL, 0, 1)) AS products
    FROM companies
    LEFT JOIN products ON (companies.id = products.company_id)
    GROUP BY companies.id;

LEFT JOIN、すべての企業が選択されるSUMことを保証し、カウントが正しいことを保証します (COUNT製品のない企業に対して単純に 1 が返されます)。

于 2012-10-30T22:23:38.630 に答える