【问题标题】:Joining two tables to get a count连接两个表以获取计数
【发布时间】:2013-04-17 14:08:18
【问题描述】:

我正在尝试使用以下有问题的 sql 查询来计算特定页面上的 cmets:

$query = "SELECT * FROM `comments` WHERE is_approved = '1' AND page_id = '943'"
$query = mysql_query($query);
$total = mysql_num_rows($query);
echo $total;

问题是它输出的是 0 而不是 2。

表格如下:

页面:

id:1 page_id:943

id:2 page_id:978

id:3 page_id:977

cmets:

id:2 page_id:1 "hello"

id:3 page_id:1 "great"

id:4 page_id:3 "super"

所以真正的原始查询应该是从页面表中设置的page_id 中获取每个评论的true page_id,并由comments.page_id = pages.id 加入

最终的代码会是什么样子来进行连接和/或获得该计数?谢谢。

【问题讨论】:

  • 我在您的 cmets 表上没有看到 is_approved 字段..
  • 无论如何你需要通过 Pages.id 和 Comments.pages_id 加入这些表
  • @Elior 这不是真的,你可以使用WHERE .. IN 声明
  • @joelharkes 但使用 JOIN 更具可读性和速度!

标签: php mysql sql join


【解决方案1】:

试试:

SELECT c.* FROM `comments` c
JOIN `pages` p on c.page_id = p.id
WHERE c.is_approved = '1' AND p.page_id = '943'

【讨论】:

  • 在 MySQL 中,连接通常比等效的相关子查询更快。
  • 马克,使用 SELECT count() 而不是 SELECT c 会得到相同的结果。 ...也许可以跳过一步?
  • @Adrian33:我想是这样 - 我将其保留为 c.*,因为我认为您想使用 cmets 表中的值(而不仅仅是计算它们)。
  • 对,这里有人这样做:stackoverflow.com/questions/6907751/… 谢谢。
【解决方案2】:
"SELECT * FROM comments, pages WHERE comments.page_id = pages.id AND is_approved = '1' AND comments.page_id = '943'"

【讨论】:

  • 应该是pages.page_id='943'
  • 请注意,这也可以通过WHERE .. IN 语句来完成
【解决方案3】:

尝试使用:

SELECT count(*) as cnt
FROM `comments` c join pages p on c.page_id =  p.id
WHERE c.is_approved = '1' AND p.page_id = '943'

在不同的表中有两个具有相同名称的列表示不同的内容,这似乎是一种非常糟糕的数据库设计。您可能应该将 pages.page_id 的名称更改为其他名称。

而且,这会直接返回计数,因此您可以从行中读取值。如果您只想要计数,则没有理由返回所有匹配的行。

【讨论】:

  • 谢谢戈登。如果直接从查询中读取,则 $query=mysql_query($query);变成 $total=mysql_query($query); - “join pages p”也应该是“join `pages` p”——在页面上加上引号?
  • @Adrian33 。 . .不行,你需要添加一个读取器,才能在运行时获取查询返回的值。
  • 这个查询是有效的,你不会介意让读者把它变成一个变量,(请原谅我现在的挑战。)
【解决方案4】:

不需要加入:

$query = "SELECT * FROM `comments` WHERE is_approved = '1' AND WHERE page_id IN (SELECT id WHERE page_id = '943')"
$query = mysql_query($query);
$total = mysql_num_rows($query);
echo $total;

如果您不需要/使用数据,我当然会建议使用计数语句:

$query = "SELECT COUNT(*) as total FROM `comments` WHERE is_approved = '1' AND WHERE page_id IN (SELECT id WHERE page_id = '943')"
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);
$total = $row['total'];
echo $total;

【讨论】:

  • 谢谢。我在第 3 行得到“mysql_fetch_array() 期望参数 1 是资源,布尔值”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2010-10-24
相关资源
最近更新 更多