我正在尝试从两个不同的表中查询信息,但我不知道如何做到最好。作为一个免责声明,我还在学习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
我显然遗漏了一些东西 - 我做错了什么?
答案 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)。