MySQL从一个表中选择COUNT,从另一个表中获取ID?

时间:2013-11-19 21:59:03

标签: php mysql

我正在尝试从两个不同的表中查询信息,但我不知道如何做到最好。作为一个免责声明,我还在学习MySQL / PHP,并且在设置它时我无法控制表 - 我正在尝试使用我已经拥有的表,因为我无法添加/改变表格。以下是表格和相关属性:

Table(attribute1, attribute2, ...);
------------------------------------
reports(id, reporter_id, added)
report_comments(comment_id, report_id, comment_text, commenter_id)

reporter_id指的是提交报告的用户,而commenter_id 与reporter_id相同的人。

我想知道每个报告者ID有多少报告评论,例如,comment_text中的“不正确”一词。然后我想创建一个表格,显示每个记者的ID以及自“1383359439”(时间戳)以来与该记者报告相关的评论数量。

到目前为止,我还没有成功。我当前的查询如下所示:

SELECT r.id, r.reporter_id, 
    (SELECT COUNT(*) FROM report_comments WHERE comment_text LIKE '%incorrect%' AND report_id = r.id) AS comments
FROM reports AS r
LEFT JOIN report_comments AS rc ON r.id = rc.report_id
WHERE r.added > 1383359439
GROUP BY r.reporter_id;

结果页面,当我将HTML表格设置为列出“reporter_id”后跟“comments”时,会给出自列出时间以来提交报告的所有人,但计数为“0”或“1”,任何在任何报告中都有“不正确”的记者评论得到“1”而没有“不正确”的记者得到“0”:

Reporter1 | 0
Reporter2 | 1
Reporter3 | 0
Reporter4 | 1
Reporter5 | 1

问题是,有些记者在其中发表了几条“不正确”的评论,我想得到每个评论,并且只针对那些记者(不是那些从未有过“错误”评论的记者)。例如:

Reporter2 | 2
Reporter4 | 17
Reporter5 | 3

我显然遗漏了一些东西 - 我做错了什么?

3 个答案:

答案 0 :(得分:2)

您需要为此使用分组。

SELECT
  r.reporter_id AS `reporter_id`,
  COUNT(rc.report_id) AS `incorrect_count`
FROM reports AS r
INNER JOIN report_comments AS rc
  ON r.id = rc.report_id
WHERE rc.comment_text LIKE '%incorrect%'
AND r.added > ?
GROUP BY `reporter_id`

此处?表示您要与之比较的时间戳。

要回答您的后续问题,有几种方法可以做到这一点。我可能建议将SUM()CASE结合使用,如下所示:

SELECT
  r.reporter_id AS `reporter_id`,
  SUM(
    CASE WHEN rc.comment_text LIKE '%incorrect%'
      THEN 1
    ELSE 0
    END CASE
  ) AS `incorrect_count`,
  SUM(
    CASE WHEN rc.comment_text LIKE '%fake%'
      THEN 2
    ELSE 0
    END CASE
  ) AS `fake_count`,     
FROM reports AS r
INNER JOIN report_comments AS rc
  ON r.id = rc.report_id
WHERE
  rc.comment_text LIKE '%incorrect%'
  OR rc.comment_text LIKE '%fake%'
AND r.added > ?
GROUP BY `reporter_id`

答案 1 :(得分:1)

你可以尝试

SELECT r.id, COUNT(c.id) tot
FROM reports r INNER JOIN report_comments
  ON r.id = c.report_id
  AND c.comment_text LIKE '%incorrect%'
  AND r.added > 1383359439
GROUP BY r.reporter_id

答案 2 :(得分:1)

它是这样的:

SELECT r.reporter_id, COUNT(*) comments
FROM reports AS r
    INNER JOIN report_comments AS rc ON r.id = rc.report_id
WHERE r.added > 1383359439
    AND comment_text LIKE '%incorrect%'
GROUP BY r.reporter_id;

我删除了r.id,因为在这种情况下没有任何意义,因为一个记者可以有很多报告(所以多个r.id)。