Maintaining a healthy and inclusive community requires effective moderation, which can include reviewing flagged posts, analyzing moderator performance, and managing user content.
This guide contains a variety of SQL reports for Discourse designed to help analyze moderation-related activities.
In this topic you will find detailed Data Explorer queries for:
- Flag resolution statistics.
- Reviewable resolution percentages.
- Moderator-specific performance metrics.
- Insights into user flagging activity.
- Comprehensive data of all flagged user, post, and topic actions
Post Flag Resolution Percentage by Type
SQL Query Explanation
This query calculates the percentage of resolutions (agreed, disagreed, deferred, deleted) for flagged posts, grouped by flag type.
-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-01-01
WITH period_actions AS (
SELECT pa.id,
pa.post_action_type_id,
pa.created_at,
pa.agreed_at,
pa.disagreed_at,
pa.deferred_at,
pa.agreed_by_id,
pa.disagreed_by_id,
pa.deferred_by_id,
pa.deleted_at,
pa.post_id,
pa.user_id,
COALESCE(pa.disagreed_at, pa.agreed_at, pa.deferred_at) AS responded_at,
EXTRACT(EPOCH FROM (COALESCE(pa.disagreed_at, pa.agreed_at, pa.deferred_at) - pa.created_at)) / 60 AS time_to_resolution_minutes -- time to resolution in minutes
FROM post_actions pa
WHERE pa.post_action_type_id IN (3,4,6,7,8)
AND pa.created_at >= :start_date
AND pa.created_at <= :end_date
),
flag_types AS (
SELECT pat.id,
CASE
WHEN pat.id = 3 THEN 'off_topic'
WHEN pat.id = 4 THEN 'inappropriate'
WHEN pat.id = 6 THEN 'notify_user'
WHEN pat.id = 7 THEN 'notify_moderators'
WHEN pat.id = 8 THEN 'spam'
END AS flag_type
FROM post_action_types pat
),
flag_resolutions AS (
SELECT
pa.post_action_type_id,
CASE
WHEN pa.agreed_at IS NOT NULL THEN 'agreed'
WHEN pa.disagreed_at IS NOT NULL THEN 'disagreed'
WHEN pa.deferred_at IS NOT NULL THEN 'deferred'
WHEN pa.deleted_at IS NOT NULL THEN 'deleted'
END AS resolution,
COUNT(*) AS resolution_count
FROM period_actions pa
GROUP BY pa.post_action_type_id, resolution
),
flag_totals AS (
SELECT
pa.post_action_type_id,
COUNT(*) AS total_flags
FROM period_actions pa
GROUP BY pa.post_action_type_id
),
resolution_percentages AS (
SELECT
fty.flag_type,
fr.resolution,
fr.resolution_count,
ft.total_flags,
ROUND((fr.resolution_count::decimal / ft.total_flags) * 100, 2) AS resolution_percentage
FROM flag_resolutions fr
JOIN flag_totals ft ON ft.post_action_type_id = fr.post_action_type_id
JOIN flag_types fty ON fty.id = fr.post_action_type_id
),
pivoted_data AS (
SELECT
flag_type,
MAX(CASE WHEN resolution = 'agreed' THEN resolution_percentage ELSE 0 END) AS agreed_percentage,
MAX(CASE WHEN resolution = 'disagreed' THEN resolution_percentage ELSE 0 END) AS disagreed_percentage,
MAX(CASE WHEN resolution = 'deferred' THEN resolution_percentage ELSE 0 END) AS deferred_percentage,
MAX(CASE WHEN resolution = 'deleted' THEN resolution_percentage ELSE 0 END) AS deleted_percentage,
MAX(CASE WHEN resolution = 'agreed' THEN resolution_count ELSE 0 END) AS agreed_count,
MAX(CASE WHEN resolution = 'disagreed' THEN resolution_count ELSE 0 END) AS disagreed_count,
MAX(CASE WHEN resolution = 'deferred' THEN resolution_count ELSE 0 END) AS deferred_count,
MAX(CASE WHEN resolution = 'deleted' THEN resolution_count ELSE 0 END) AS deleted_count,
MAX(total_flags) AS total_flags
FROM resolution_percentages
GROUP BY flag_type
)
SELECT
flag_type,
agreed_percentage,
agreed_count,
disagreed_percentage,
disagreed_count,
deferred_percentage,
deferred_count,
deleted_percentage,
deleted_count,
total_flags
FROM pivoted_data
ORDER BY flag_type
Parameters Used
:start_date
: The start date for filtering flagged posts.:end_date
: The end date for filtering flagged posts.
CTEs Explanation
period_actions
: Filters flagged posts within the specified date range and calculates the time to resolution for each flag.flag_types
: Maps flag type IDs to human-readable names (e.g., off-topic, inappropriate, spam).flag_resolutions
: Groups flags by type and resolution (agreed, disagreed, deferred, deleted) and counts the occurrences of each resolution.flag_totals
: Calculates the total number of flags for each flag type.resolution_percentages
: Combines resolution counts and total flags to calculate the percentage of each resolution type for each flag type.pivoted_data
: Pivots the data to display resolution percentages and counts in separate columns for each resolution type.
Results Explanation
The final result is a table showing:
- Flag type (e.g., off-topic, spam).
- Percentages and counts for each resolution type (agreed, disagreed, deferred, deleted).
- Total flags for each flag type.
Example Results
Flag Type | Agreed % | Agreed Count | Disagreed % | Disagreed Count | Deferred % | Deferred Count | Deleted % | Deleted Count | Total Flags |
---|---|---|---|---|---|---|---|---|---|
off_topic | 50.00 | 25 | 30.00 | 15 | 10.00 | 5 | 10.00 | 5 | 50 |
spam | 70.00 | 35 | 20.00 | 10 | 5.00 | 2 | 5.00 | 3 | 50 |
Reviewables Resolution Percentages
SQL Query Explanation
This query analyzes the resolution statuses of reviewable items (e.g., flagged posts) within a given date range. It calculates the percentage and count of each resolution status for each flag type.
-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-01-01
WITH flag_data AS (
SELECT
r.type AS flag_type,
r.status AS resolution_status,
COUNT(*) AS flag_count
FROM
reviewables r
WHERE
r.created_at BETWEEN :start_date AND :end_date
GROUP BY
r.type,
r.status
),
flag_totals AS (
SELECT
flag_type,
SUM(flag_count) AS total_flags
FROM
flag_data
GROUP BY
flag_type
),
flag_percentages AS (
SELECT
fd.flag_type,
fd.resolution_status,
fd.flag_count,
ROUND((fd.flag_count::decimal / ft.total_flags) * 100, 2) AS percentage
FROM
flag_data fd
JOIN
flag_totals ft
ON
fd.flag_type = ft.flag_type
)
SELECT
fp.flag_type,
-- Percentages
COALESCE(MAX(CASE WHEN fp.resolution_status = 1 THEN fp.percentage END), 0) AS pending_percentage,
COALESCE(MAX(CASE WHEN fp.resolution_status = 2 THEN fp.percentage END), 0) AS approved_percentage,
COALESCE(MAX(CASE WHEN fp.resolution_status = 3 THEN fp.percentage END), 0) AS rejected_percentage,
COALESCE(MAX(CASE WHEN fp.resolution_status = 4 THEN fp.percentage END), 0) AS ignored_percentage,
COALESCE(MAX(CASE WHEN fp.resolution_status = 5 THEN fp.percentage END), 0) AS deleted_percentage,
-- Counts
COALESCE(MAX(CASE WHEN fp.resolution_status = 1 THEN fp.flag_count END), 0) AS pending_count,
COALESCE(MAX(CASE WHEN fp.resolution_status = 2 THEN fp.flag_count END), 0) AS approved_count,
COALESCE(MAX(CASE WHEN fp.resolution_status = 3 THEN fp.flag_count END), 0) AS rejected_count,
COALESCE(MAX(CASE WHEN fp.resolution_status = 4 THEN fp.flag_count END), 0) AS ignored_count,
COALESCE(MAX(CASE WHEN fp.resolution_status = 5 THEN fp.flag_count END), 0) AS deleted_count
FROM
flag_percentages fp
GROUP BY
fp.flag_type
ORDER BY
fp.flag_type
Parameters Used
:start_date
: The start date for filtering reviewables.:end_date
: The end date for filtering reviewables.
CTEs Explanation
flag_data
: Groups reviewables by flag type and resolution status, counting the occurrences of each combination.flag_totals
: Calculates the total number of flags for each flag type.flag_percentages
: Combines flag counts and totals to calculate the percentage of each resolution status for each flag type.
Results Explanation
The final result is a table showing:
- Flag type.
- Percentages and counts for each resolution status (pending, approved, rejected, ignored, deleted).
Example Results
Flag Type | Pending % | Pending Count | Approved % | Approved Count | Rejected % | Rejected Count | Ignored % | Ignored Count | Deleted % | Deleted Count |
---|---|---|---|---|---|---|---|---|---|---|
off_topic | 20.00 | 10 | 50.00 | 25 | 10.00 | 5 | 10.00 | 5 | 10.00 | 5 |
spam | 10.00 | 5 | 70.00 | 35 | 10.00 | 5 | 5.00 | 2 | 5.00 | 3 |
Moderator Flag Resolutions
SQL Query Explanation
This query provides insights into moderator activity by showing which moderators resolved flagged posts, the types of flags they handled, and the resolutions they applied. It calculates percentages and counts for each resolution type.
-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-01-01
-- boolean :only_staff = false
WITH period_actions AS (
SELECT
pa.id,
pa.post_action_type_id,
pa.created_at,
pa.agreed_at,
pa.disagreed_at,
pa.deferred_at,
pa.agreed_by_id,
pa.disagreed_by_id,
pa.deferred_by_id,
pa.deleted_at,
pa.post_id,
pa.user_id,
COALESCE(pa.disagreed_at, pa.agreed_at, pa.deferred_at) AS responded_at,
EXTRACT(EPOCH FROM (COALESCE(pa.disagreed_at, pa.agreed_at, pa.deferred_at) - pa.created_at)) / 60 AS time_to_resolution_minutes -- time to resolution in minutes
FROM post_actions pa
WHERE pa.post_action_type_id IN (3,4,6,7,8)
AND pa.created_at >= :start_date
AND pa.created_at <= :end_date
),
flag_types AS (
SELECT
pat.id,
CASE
WHEN pat.id = 3 THEN 'off_topic'
WHEN pat.id = 4 THEN 'inappropriate'
WHEN pat.id = 6 THEN 'notify_user'
WHEN pat.id = 7 THEN 'notify_moderators'
WHEN pat.id = 8 THEN 'spam'
END AS flag_type
FROM post_action_types pat
),
flag_resolutions AS (
SELECT
pa.user_id,
pa.post_action_type_id,
CASE
WHEN pa.agreed_at IS NOT NULL THEN 'agreed'
WHEN pa.disagreed_at IS NOT NULL THEN 'disagreed'
WHEN pa.deferred_at IS NOT NULL THEN 'deferred'
WHEN pa.deleted_at IS NOT NULL THEN 'deleted'
END AS resolution,
COUNT(*) AS resolution_count
FROM period_actions pa
GROUP BY pa.user_id, pa.post_action_type_id, resolution
),
flag_totals AS (
SELECT
pa.user_id,
pa.post_action_type_id,
COUNT(*) AS total_flags
FROM period_actions pa
GROUP BY pa.user_id, pa.post_action_type_id
),
resolution_percentages AS (
SELECT
fr.user_id,
fty.flag_type,
fr.resolution,
fr.resolution_count,
ft.total_flags,
ROUND((fr.resolution_count::decimal / ft.total_flags) * 100, 2) AS resolution_percentage
FROM flag_resolutions fr
JOIN flag_totals ft ON ft.user_id = fr.user_id AND ft.post_action_type_id = fr.post_action_type_id
JOIN flag_types fty ON fty.id = fr.post_action_type_id
),
pivoted_data AS (
SELECT
rp.user_id,
rp.flag_type,
MAX(CASE WHEN rp.resolution = 'agreed' THEN rp.resolution_percentage ELSE 0 END) AS agreed_percentage,
MAX(CASE WHEN rp.resolution = 'disagreed' THEN rp.resolution_percentage ELSE 0 END) AS disagreed_percentage,
MAX(CASE WHEN rp.resolution = 'deferred' THEN rp.resolution_percentage ELSE 0 END) AS deferred_percentage,
MAX(CASE WHEN rp.resolution = 'deleted' THEN rp.resolution_percentage ELSE 0 END) AS deleted_percentage,
MAX(CASE WHEN rp.resolution = 'agreed' THEN rp.resolution_count ELSE 0 END) AS agreed_count,
MAX(CASE WHEN rp.resolution = 'disagreed' THEN rp.resolution_count ELSE 0 END) AS disagreed_count,
MAX(CASE WHEN rp.resolution = 'deferred' THEN rp.resolution_count ELSE 0 END) AS deferred_count,
MAX(CASE WHEN rp.resolution = 'deleted' THEN rp.resolution_count ELSE 0 END) AS deleted_count,
MAX(rp.total_flags) AS total_flags
FROM resolution_percentages rp
GROUP BY rp.user_id, rp.flag_type
)
SELECT
u.id AS user_id,
u.username,
p.flag_type,
p.agreed_percentage,
p.agreed_count,
p.disagreed_percentage,
p.disagreed_count,
p.deferred_percentage,
p.deferred_count,
p.deleted_percentage,
p.deleted_count,
p.total_flags
FROM pivoted_data p
JOIN users u ON u.id = p.user_id
WHERE (:only_staff = false OR (u.admin = true OR u.moderator = true))
ORDER BY u.username, p.flag_type, p.total_flags
Parameters Used
:start_date
: The start date for filtering flagged posts.:end_date
: The end date for filtering flagged posts.:only_staff
: A boolean parameter to filter results to include only staff members.
CTEs Explanation
period_actions
: Filters flagged posts within the specified date range and calculates the time to resolution for each flag.flag_types
: Maps flag type IDs to human-readable names.flag_resolutions
: Groups flags by user, flag type, and resolution, counting the occurrences of each combination.flag_totals
: Calculates the total number of flags for each user and flag type.resolution_percentages
: Combines resolution counts and totals to calculate percentages for each resolution type.pivoted_data
: Pivots the data to display resolution percentages and counts in separate columns for each resolution type.
Results Explanation
The final result is a table showing:
- Moderator username.
- Percentages and counts for each resolution type (agreed, disagreed, deferred, deleted).
- Total flags handled by each moderator.
Example Results
Moderator | Flag Type | Agreed % | Agreed Count | Disagreed % | Disagreed Count | Deferred % | Deferred Count | Deleted % | Deleted Count | Total Flags |
---|---|---|---|---|---|---|---|---|---|---|
mod1 | off_topic | 60.00 | 30 | 20.00 | 10 | 10.00 | 5 | 10.00 | 5 | 50 |
mod2 | spam | 70.00 | 35 | 20.00 | 10 | 5.00 | 2 | 5.00 | 3 | 50 |
Who is Flagging Posts
SQL Query Explanation
This query identifies the users who flagged posts within a specified date range and calculates the total number of flags submitted by each user.
-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-01-01
-- boolean :only_staff = false
SELECT
u.id AS user_id,
u.username,
COUNT(pa.id) AS flag_count
FROM post_actions pa
JOIN users u ON u.id = pa.user_id
WHERE pa.post_action_type_id IN (3, 4, 6, 7, 8) -- flag types
AND pa.created_at >= :start_date
AND pa.created_at <= :end_date
AND (:only_staff = false OR (u.admin = true OR u.moderator = true))
GROUP BY u.id, u.username
ORDER BY flag_count DESC, u.username
LIMIT 10
Parameters Used
:start_date
: The start date for filtering flagged posts.:end_date
: The end date for filtering flagged posts.:only_staff
: A boolean parameter to filter results to include only staff members.
Results Explanation
The final result is a ranked list of users with their flag counts.
Example Results
User ID | Username | Flag Count |
---|---|---|
1 | user1 | 50 |
2 | user2 | 30 |
3 | user3 | 20 |
User Notes
SQL Query Explanation
This query retrieves user notes stored in the plugin_store_rows
table. It extracts details such as the user ID, creation date, note content, and the creator’s ID.
-- [params]
-- date :start_date = 2025-01-01
-- date :end_date = 2026-01-01
WITH user_notes AS (
SELECT
REPLACE(key, 'notes:', '')::int AS user_id,
notes.value->>'created_at' AS created_at,
notes.value->>'raw' AS user_note,
notes.value->>'created_by' AS created_by
FROM plugin_store_rows,
LATERAL json_array_elements(value::json) notes
WHERE plugin_name = 'user_notes'
ORDER BY 2 DESC
)
SELECT
un.user_id,
un.created_at::date,
un.user_note,
un.created_by AS created_by_user_id
FROM user_notes un
JOIN users u ON u.id = un.user_id
WHERE un.created_at::date BETWEEN :start_date AND :end_date
ORDER BY created_at DESC
Parameters Used
:start_date
: The start date for filtering user notes.:end_date
: The end date for filtering user notes.
Results Explanation
The final result is a detailed list of user notes with relevant metadata.
Example Results
User ID | Created At | User Note | Created By User ID |
---|---|---|---|
1 | 2025-01-01 | This user is helpful. | 2 |
2 | 2025-02-01 | This user is associated with two other user accounts. | 3 |
Moderator KPIs - Flags and Avg Flag Resolution Time
SQL Query Explanation
This query evaluates moderator performance by calculating the number of flags handled and the average resolution time (in minutes) for each moderator.
-- [params]
-- date :start_date = 2025-01-01
-- date :end_date = 2026-01-01
WITH period_actions AS (
SELECT pa.id,
pa.post_action_type_id,
pa.created_at,
pa.agreed_at,
pa.disagreed_at,
pa.deferred_at,
pa.agreed_by_id,
pa.disagreed_by_id,
pa.deferred_by_id,
pa.post_id,
pa.user_id,
COALESCE(pa.disagreed_at, pa.agreed_at, pa.deferred_at) AS responded_at,
EXTRACT(EPOCH FROM (COALESCE(pa.disagreed_at, pa.agreed_at, pa.deferred_at) - pa.created_at)) / 60 AS time_to_resolution_minutes -- time to resolution in minutes
FROM post_actions pa
WHERE pa.post_action_type_id IN (3,4,6,7,8) -- Flag types
AND pa.created_at >= :start_date
AND pa.created_at <= :end_date
),
moderator_actions AS (
SELECT pa.id,
pa.post_id,
pa.created_at,
pa.responded_at,
pa.time_to_resolution_minutes,
COALESCE(pa.agreed_by_id, pa.disagreed_by_id, pa.deferred_by_id) AS moderator_id
FROM period_actions pa
WHERE COALESCE(pa.agreed_by_id, pa.disagreed_by_id, pa.deferred_by_id) IS NOT NULL
),
moderator_stats AS (
SELECT
m.moderator_id,
u.username AS moderator_username,
COUNT(m.id) AS handled_flags,
AVG(m.time_to_resolution_minutes) AS avg_resolution_time_minutes
FROM moderator_actions m
JOIN users u ON u.id = m.moderator_id
GROUP BY m.moderator_id, u.username
)
SELECT
ms.moderator_username,
ms.handled_flags,
ROUND(ms.avg_resolution_time_minutes::numeric, 2) AS avg_resolution_time_minutes
FROM moderator_stats ms
ORDER BY ms.handled_flags DESC, ms.avg_resolution_time_minutes ASC
Parameters Used
:start_date
: The start date for filtering flagged posts.:end_date
: The end date for filtering flagged posts.
CTEs Explanation
period_actions
: Filters flagged posts within the specified date range and calculates the time to resolution for each flag.moderator_actions
: Identifies flags resolved by moderators and calculates the time to resolution for each flag.moderator_stats
: Groups flags by moderator and calculates the total number of flags handled and the average resolution time.
Results Explanation
The final result is a ranked list of moderators with their handled flag counts and average resolution times.
Example Results
Moderator Username | Handled Flags | Avg Resolution Time (Minutes) |
---|---|---|
mod1 | 50 | 15.00 |
mod2 | 30 | 20.00 |
All Flag Data
SQL Query Explanation
This query provides a comprehensive dataset of all flagged user, post, and topic data within a specified date range. It combines data from multiple tables to include details such as the flag type, flagged item, flag reason, flag source, resolution decision, and related messages.
-- [params]
-- date :start_date = 2020-01-01
-- date :end_date = 2026-01-01
WITH flag_data AS (
SELECT
r.id AS flag_id,
p.id AS post_id,
p.topic_id,
p.raw AS flagged_item_text,
p.user_id AS post_author_id,
fu.username AS flagged_by_username,
r.created_at AS flagged_date,
r.type AS flag_type,
r.reviewable_by_moderator AS flag_source,
r.payload AS flag_reason,
r.status AS review_status,
rs.reviewed_by_id,
rs.reviewed_at,
rs.score AS review_score,
ru.username AS reviewed_by_username
FROM
reviewables r
LEFT JOIN posts p ON r.target_id = p.id AND r.target_type = 'Post'
LEFT JOIN users fu ON r.created_by_id = fu.id
LEFT JOIN reviewable_scores rs ON rs.reviewable_id = r.id
LEFT JOIN users ru ON rs.reviewed_by_id = ru.id
WHERE
r.created_at BETWEEN :start_date AND :end_date
),
review_decisions AS (
SELECT
0 AS status_code, 'pending' AS decision_name
UNION ALL
SELECT
1 AS status_code, 'agreed' AS decision_name
UNION ALL
SELECT
2 AS status_code, 'disagreed' AS decision_name
UNION ALL
SELECT
3 AS status_code, 'ignored' AS decision_name
),
flag_types AS (
SELECT
3 AS post_action_type_id, 'off_topic' AS flag_type_name
UNION ALL
SELECT
4 AS post_action_type_id, 'inappropriate' AS flag_type_name
UNION ALL
SELECT
6 AS post_action_type_id, 'notify_user' AS flag_type_name
UNION ALL
SELECT
7 AS post_action_type_id, 'notify_moderators' AS flag_type_name
UNION ALL
SELECT
8 AS post_action_type_id, 'spam' AS flag_type_name
UNION ALL
SELECT
10 AS post_action_type_id, 'illegal' AS flag_type_name
)
SELECT
fd.flag_id,
fd.post_id AS flagged_item,
fd.flagged_by_username,
fd.flagged_date,
ft.flag_type_name AS flag_type,
fd.flag_source as reviewable_by_moderator,
fd.flag_reason,
fd.flagged_item_text,
pa.related_post_id AS related_message_id_post_id,
regexp_replace(rp.raw, '(https?://[^\s]+)', '', 'g') AS related_message_text, -- Removes only URLs
fd.reviewed_by_username AS reviewed_by,
rd.decision_name AS review_decision
FROM
flag_data fd
LEFT JOIN post_actions pa
ON pa.post_id = fd.post_id
LEFT JOIN posts rp
ON pa.related_post_id = rp.id
LEFT JOIN flag_types ft
ON pa.post_action_type_id = ft.post_action_type_id
LEFT JOIN review_decisions rd
ON fd.review_status = rd.status_code
ORDER BY
fd.flagged_date DESC
Parameters Used
:start_date
: The start date for filtering flagged posts.:end_date
: The end date for filtering flagged posts.
CTEs Explanation
flag_data
: Retrieves detailed information about flagged posts, including the flag ID, flagged item, flag type, flag reason, flag source, and review details.review_decisions
: Maps review status codes to human-readable decision names (e.g., pending, agreed, disagreed, ignored).flag_types
: Maps post action type IDs to human-readable flag type names (e.g., off-topic, inappropriate, spam).
Results Explanation
The final result is a detailed table that includes:
- Flag ID: Unique identifier for the flag.
- Flagged Item: The ID of the flagged post.
- Flagged By Username: The username of the user who flagged the post.
- Flagged Date: The date when the flag was created.
- Flag Type: The type of flag (e.g., off-topic, spam, inappropriate).
- Reviewable By Moderator: Indicates whether the flag was raised by a user or the system.
- Flag Reason: The reason provided for the flag.
- Flagged Item Text: The content of the flagged post.
- Related Message ID: The ID of any related message (if applicable).
- Related Message Text: The content of the related message, with URLs removed.
- Reviewed By Username: The username of the moderator who reviewed the flag.
- Review Decision: The decision made by the reviewer (e.g., agreed, disagreed, ignored, deleted).
Example Results (Anonymized)
Flag ID | Flagged Item | Flagged By Username | Flagged Date | Flag Type | Reviewable By Moderator | Flag Reason | Flagged Item Text | Related Message ID | Related Message Text | Reviewed By Username | Review Decision |
---|---|---|---|---|---|---|---|---|---|---|---|
10001 | 20001 | user123 | 2025-02-13T16:16:15Z | inappropriate | true | {“targets_topic”:false} | “Example inappropriate content” | NULL | NULL | mod001 | agreed |
10002 | 20002 | user456 | 2025-02-13T14:28:34Z | spam | true | {“targets_topic”:false} | “Example Spam Content” | NULL | NULL | mod002 | ignored |
10003 | 20003 | user789 | 2025-02-13T14:27:54Z | off_topic | true | {“targets_topic”:false} | “off topic discussion.” | NULL | NULL | mod003 | ignored |
10004 | NULL | system | 2025-02-13T10:38:09Z | NULL | true | {“username”:“ExampleUser”,“name”:“Example Name",“email”:"example@example.com”,“bio”:“Example bio text.”,“website”:“https://example.com”} | NULL | NULL | NULL | mod004 | disagreed |
10005 | 20005 | user321 | 2025-02-13T10:08:20Z | notify_moderators | true | {“targets_topic”:false} | “A post requiring moderation attention” | 30001 | “This is a related message providing additional context for the flagged post.” | mod005 | agreed |