MySQL - 来自两个表的内部联接计数

时间:2017-04-28 22:34:32

标签: php mysql

我有两张桌子:

分类

| 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>
';
}

但这不起作用。怎么了?

1 个答案:

答案 0 :(得分:0)

查询看起来不正确。 SELECT列表中有一个聚合,没有GROUP BY子句。如果查询返回结果,那么它将是一行。如果我们要返回COUNT,那么在SELECT列表中返回非聚合是没有意义的。

假设idcategory表中的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);
}