在从数据库中提取类别期间按类别过滤计数行

时间:2012-10-30 22:12:47

标签: php mysql pdo count

我的数据库中有两个表

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 SELECT元素制作公司选择器(按公司过滤产品),其中包含来自表格companiesCOUNT的所有公司的名称列表中公司名称后的产品。

所以,我的目标是获得SELECT这样的选项:

  • 公司1(4)
  • 公司2(1)
  • 公司3(2)
  • 公司4(0)

(注意:括号内的数字来自上面的例子)

到目前为止我尝试了什么?

我之前使用的是mysql_*个函数,后来它是mysqli程序模型。我可以手动执行此操作,对公司进行一次查询,在while块内进行另一次查询,以获取COUNT个元素(按循环中当前公司的id进行过滤)。现在我正在尝试使用PDO object,这对我来说是新的,我对它不是很熟悉。

问题

是否有可能通过一个查询(使用COUNT或其他内容)获取JOINs?如果没有,我如何使用我的$dbPDO对象在循环内查询(旧方法)?或者其他任何方式?

我在这里看了一些例子,但没有什么能适应我的要求。也许我错过了一些东西但是使用PDO对我来说仍然很痛苦(我必须尽快学习)。

看看我自己的问题,我认为这不是什么难事,但最糟糕的是,我自己找不到解决方案

最后,我在mysqli中有解决方案,只是我不喜欢它,并认为有更简单的方法来完成这项任务!

我认为question是我需要的东西,但仍然不理解答案中的查询。

到目前为止,我有这段代码,并且不知道如何让它产品计算:

  $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;

希望我已经澄清了足够多的问题。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分: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)。