我的数据库中有两个表

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;


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

最佳答案

您可以在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)。

08-06 02:57
查看更多