【问题标题】:Get One Normal Table and Counts From Another Table In One SQL Query (JOIN)在一个 SQL 查询 (JOIN) 中获取一个普通表并从另一个表中计数
【发布时间】:2016-11-09 13:45:46
【问题描述】:

我需要一个 SQL 查询,它给出一个表的内容和第二个表的计数。我试过了,不行。

我有一个“cmets”表。而在另一个名为“likes”的表中,有 cmets 的点赞数。

在我的算法中,在“likes”表中,有一列名为“likeType”,如果是“1”表示点赞,否则(如果是“0”)表示不喜欢。我需要在一个查询中从“comments”表中带来评论,从“likings”表中获取likeType=1likeType=0 的计数。

这是我最好的尝试,但没有奏效:


PHP端:

   $getFirst8Comments = "SELECT
                            episodecomments.cmtID,
                            episodecomments.cmtConEpisode,
                            episodecomments.cmtOwner,
                            episodecomments.cmtDate,
                            episodecomments.cmtContent,
                            episodecomments.cmtSpoiler,
                            SUM(IF(episodecommentsliking.liType='1', 1, 0)) AS likes,
                            SUM(IF(episodecommentsliking.liType='0', 1, 0)) AS dislikes
                        FROM episodecomments
                        LEFT JOIN episodecommentsliking
                        ON episodecomments.cmtID = episodecommentsliking.liCmtID
                        GROUP BY
                            episodecomments.cmtID,
                            episodecomments.cmtConEpisode,
                            episodecomments.cmtOwner,
                            episodecomments.cmtDate,
                            episodecomments.cmtContent,
                            episodecomments.cmtSpoiler
                        WHERE episodecomments.cmtConEpisode='$epID'
                        ORDER BY episodecomments.cmtID
                        DESC LIMIT 8";

   while ($getF8C = mysqli_fetch_array($getFirst8Comments))
   {
      echo "Something coming through-<br>";
   }

错误弹出:Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, string given in J:\file.php on line 3484 (error in variable $getFirst8Comments)

提前致谢。

【问题讨论】:

标签: php mysql sql join


【解决方案1】:

MySQL 不支持这种方式的COUNT。您还需要告知它GROUP BY 用于这些聚合(求和)函数的内容。

尝试使用SUM 代替:(如果您计算NULL 与非NULL 值,COUNT 会起作用 - 请参阅MySQL documentation

  SELECT
    comments.cmtID,
    comments.cmtConEpisode,
    comments.cmtOwner,
    comments.cmtDate,
    comments.cmtContent,
    comments.cmtSpoiler,
    SUM(IF(commentsliking.liType='1', 1, 0)) AS likes,
    SUM(IF(commentsliking.liType='0', 1, 0)) AS dislikes
  FROM comments
  INNER JOIN commentsliking
    ON comments.cmtID = commentsliking.liCmtID
  GROUP BY
    comments.cmtID,
    comments.cmtConEpisode,
    comments.cmtOwner,
    comments.cmtDate,
    comments.cmtContent,
    comments.cmtSpoiler
  ORDER BY comments.cmtID
  DESC LIMIT 8

另外 - 如果评论记录可能存在而没有类似数据,请使用“LEFT JOIN”。


我已进一步更新了我的答案,以解决您报告的 mysqli_* 命令引发的错误。

查看PHP documentation 以获取有关如何正确使用mysqli_fetch_array() 函数的完整详细信息——尤其是关于它需要mysqli_result 类型作为参数,而不是string [of SQL])

【讨论】:

  • 我正在尝试应用它,但根据 php.ini 的说法,它就像查询中某处存在语法错误一样。 Warning: mysql_fetch_array() expects parameter 1 to be mysqli_result(), string given in $getComments.。我仔细检查了列名,它们似乎是真的。感谢您的关注。
  • 这是 PHP/MySQL 客户端问题,而不是 SQL 的语法问题。您需要在某处发布完整的代码副本,以便我查看问题所在。
  • 我可以看到问题。检查mysqli_fetch_array (php.net/manual/en/mysqli-result.fetch-array.php) 的文档。你可以看到它需要一个 mysqli_result 类型的对象传入它——而不是一个 SQL 字符串。该 PHP 文档页面上有一个完整的示例,显示了如何连接到数据库并以您尝试执行的方式执行查询。
  • 感谢四位您的帮助,但由于我的尝试,我了解到 'GROUP BY' 必须写在 'WHERE' 之后:D 我已修复,并且有效。再次感谢您的关注。
  • 没问题。您可能会发现我不久前在另一个问题上给出的有用答案 - 我解释了如何阅读 MySQL 文档来诊断问题,例如 GROUP BY 应该在 WHERE 之前还是之后:stackoverflow.com/questions/34020387/…
猜你喜欢
  • 2012-03-15
  • 2010-10-24
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多