我的数据库中有两个表
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
元素(列表中公司名称后的产品表companies
和COUNT
中所有公司的名称)创建公司选择器(按公司过滤产品)。因此,我的目标是获得这样的
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)。