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
相关产品推荐
相关产品推荐

