You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询实现按用户返回已读与未读FAQ记录

问题描述

现有两张表:

  • Faq:存储流程信息
  • LeituraFaq:记录用户点击流程后的阅读情况

建表及插入数据的SQL如下:

CREATE TABLE Faq ( id INT, Titulo varchar(30) );
INSERT INTO Faq VALUES
(1, 'Teste'),
(2, 'Teste1'),
(3, 'Teste2'),
(4, 'Teste3'),
(5, 'Teste4');

CREATE TABLE LeituraFaq( id INT, Id_Faq INT, leitura INT, Colaborador INT );
INSERT INTO LeituraFaq VALUES
(1, 3, 1, 19),
(2, 5, 1, 19),
(1, 3, 1, 24),
(1, 2, 1, 24);

需求是统计指定用户已读和未读的所有流程信息,目前的查询语句只能返回指定用户已读的流程:

SELECT Faq.id, Titulo, LeituraFaq.Colaborador, leitura 

FROM Faq LEFT OUTER JOIN LeituraFaq ON LeituraFaq.Id_Faq = Faq.id

WHERE LeituraFaq.Colaborador = '19'

期望以用户ID 19为例,返回结果如下:

id  Titulo  Colaborador leitura
1   Teste
2   Teste1
3   Teste2    19           1
4   Teste3
5   Teste4    19           1

要求查询能按用户动态生成。

解决方案

修改后的查询语句如下,核心是将用户筛选条件从WHERE子句移到LEFT JOIN的关联条件中,这样就能保留Faq表的所有记录,同时仅匹配指定用户的阅读数据:

SELECT 
    Faq.id, 
    Faq.Titulo, 
    LeituraFaq.Colaborador, 
    LeituraFaq.leitura
FROM Faq
LEFT OUTER JOIN LeituraFaq 
    ON LeituraFaq.Id_Faq = Faq.id 
    AND LeituraFaq.Colaborador = '19' -- 将用户条件移到JOIN条件里

说明

  • 原查询的WHERE LeituraFaq.Colaborador = '19'会过滤掉所有未匹配到该用户的Faq记录(未匹配时LeituraFaq.Colaborador为NULL,不满足等于19的条件),导致只返回已读流程。
  • 将用户筛选条件放到LEFT JOIN的关联条件中,Faq表的所有记录都会被保留,匹配到用户阅读记录的行会显示对应的Colaborador和leitura值,未匹配的行则显示NULL,正好对应未读的流程。

如果需要动态指定用户,可以使用参数化查询(不同数据库语法略有差异),以MySQL为例:

SET @user_id = 19; -- 动态设置用户ID
SELECT 
    Faq.id, 
    Faq.Titulo, 
    LeituraFaq.Colaborador, 
    LeituraFaq.leitura
FROM Faq
LEFT OUTER JOIN LeituraFaq 
    ON LeituraFaq.Id_Faq = Faq.id 
    AND LeituraFaq.Colaborador = @user_id;

内容的提问来源于stack exchange,提问作者Bruno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:42:24