我有两张桌子:
分类
| id | 名称 | 案例 |
项
| id | 名称 | categoryid | < - 这是关系列
我试着用你各自的项目数显示所有类别,如下所示:
分类名称:摘要[15项]
我正在使用此代码:
$getcategory = mysqli_query($con, "
SELECT c.name
, c.id
, c.case
, i.id
, COUNT(i.categoriaid) AS photos
FROM category c
JOIN items i
ON c.id = i.categoriaid
WHERE i.id != ''
ORDER
BY c.id ASC
");
while ($showcategory = mysqli_fetch_array($getcategory)) {
echo '
<div class="category-container">
<div class="category-title">'.$showcategory['name'].'</div>
<div class="category-img-container">
<div class="img-stretch"><img src="'.$showcategory['case'].'" alt=""/></div>
</div>
<div class="category-count"><div><span class="destaque alto">[ '.$showcategory['photos'].' ]</span> telas</div></div>
</div>
';
}
但这不起作用。怎么了?
答案 0 :(得分:0)
查询看起来不正确。 SELECT列表中有一个聚合,没有GROUP BY子句。如果查询返回结果,那么它将是一行。如果我们要返回COUNT,那么在SELECT列表中返回非聚合是没有意义的。
假设id
是category
表中的PRIMARY KEY(或唯一键),如果sql_mode不包含ONLY_FULL_GROUP_BY,我们可能会运行它:
SELECT c.name
, c.id
, c.case
, MIN(i.id) AS min_id
, MAX(i.id) AS max_id
, COUNT(i.categoriaid) AS photos
FROM category c
LEFT
JOIN items i
ON i.categoriaid = c.id
AND i.id <> ''
GROUP BY c.id
ORDER BY c.id
如果sql_mode包含ONLY_FULL_GROUP_BY,我们可以在c.name和c.case周围使用聚合函数(例如MIN或MAX),或者我们可以扩展GROUP BY子句以包含这些列。
SELECT c.name
, c.id
, c.case
, MIN(i.id) AS min_id
, MAX(i.id) AS max_id
, COUNT(i.categoriaid) AS photos
FROM category c
LEFT
JOIN items i
ON i.categoriaid = c.id
AND i.id <> ''
GROUP
BY c.id
, c.name
, c.case
ORDER
BY c.id
没有规范,我们只是在猜测。这句话可能有许多“错误”的事情。作为示例列表:无效的表引用,无效的列引用(items表中是否有列名categoriaid
?我从问题中的SQL中获取了该名称。)
我建议你把SQL写入另一个环境,并编写和测试SQL。然后将该语句带回PHP代码中。 (分而治之。)
此外,在PHP代码中,我们可以通过测试mysqli_query
的返回来测试查询执行是否成功。如果它为FALSE,那么我们知道它不成功,我们可以使用mysqli_error
函数检索错误。
$sql = "SELECT ... ";
if( !$getcategory = mysqli_query($con,$sql) ) {
// statement execution was not successful
die mysqli_error($con);
}