我的数据库中有两个表
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
这样的选项:
(注意:括号内的数字来自上面的例子)
我之前使用的是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;
希望我已经澄清了足够多的问题。任何帮助,将不胜感激。
答案 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)。