0

我的数据库中有两个表

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块内COUNT的元素(按循环中当前公司的 id 过滤)。现在我正在尝试使用PDO object这对我来说是新事物,但我对它不是很熟悉。

问题

是否有可能COUNT通过一个查询(使用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 回答