当前位置: 首页 > 面试题库 >

MySQL:具有LEFT JOIN的GROUP_CONCAT

柯易安
2023-03-14
问题内容

我在使用MySQL的“ GROUP_CONCAT”功能时遇到问题。我将使用一个简单的帮助台数据库来说明我的问题:

CREATE TABLE Tickets (
 id INTEGER NOT NULL PRIMARY KEY,
 requester_name VARCHAR(255) NOT NULL,
 description TEXT NOT NULL);

CREATE TABLE Solutions (
 id INTEGER NOT NULL PRIMARY KEY,
 ticket_id INTEGER NOT NULL,
 technician_name VARCHAR(255) NOT NULL,
 solution TEXT NOT NULL,
 FOREIGN KEY (ticket_id) REFERENCES Tickets.id);

INSERT INTO Tickets VALUES(1, 'John Doe', 'My computer is not booting.');
INSERT INTO Tickets VALUES(2, 'Jane Doe', 'My browser keeps crashing.');
INSERT INTO Solutions VALUES(1, 1, 'Technician A', 'I tried to solve this but was unable to. I will pass this on to Technician B since he is more experienced than I am.');
INSERT INTO Solutions VALUES(2, 1, 'Technician B', 'I reseated the RAM and that fixed the problem.');
INSERT INTO Solutions VALUES(3, 2, 'Technician A', 'I was unable to figure this out. I will again pass this on to Technician B.');
INSERT INTO Solutions VALUES(4, 2, 'Technician B', 'I re-installed the browser and that fixed the problem.');

请注意,该帮助台数据库有两个票证,每个票证都有两个解决方案条目。我的目标是使用SELECT语句创建数据库中所有故障单及其对应解决方案条目的列表。这是我正在使用的SELECT语句:

SELECT Tickets.*, GROUP_CONCAT(Solutions.solution) AS CombinedSolutions
FROM Tickets
LEFT JOIN Solutions ON Tickets.id = Solutions.ticket_id
ORDER BY Tickets.id;

上面的SELECT语句的问题在于它仅返回一行:

id: 1
requester_name: John Doe
description: My computer is not booting.
CombinedSolutions: I tried to solve this but was unable to. I will pass this on to Technician B since he is more experienced than I am.,I reseated the RAM and that fixed the problem.,I was unable to figure this out. I will again pass this on to Technician B.,I re-installed the browser and that fixed the problem.

请注意,它正在返回票证1的信息以及票证1和票证2的解决方案条目。

我究竟做错了什么?谢谢!


问题答案:

采用:

   SELECT t.*,
          x.combinedsolutions
     FROM TICKETS t
LEFT JOIN (SELECT s.ticket_id,
                  GROUP_CONCAT(s.soution) AS combinedsolutions
             FROM SOLUTIONS s 
         GROUP BY s.ticket_id) x ON x.ticket_id = t.ticket_id

备用:

   SELECT t.*,
          (SELECT GROUP_CONCAT(s.soution)
             FROM SOLUTIONS s 
            WHERE s.ticket_id = t.ticket_id) AS combinedsolutions
     FROM TICKETS t


 类似资料:
  • 问题内容: 很抱歉,我只学习了PHP和MySQL,已经搜索了一个多星期,但是没有找到任何答案。 我创建了一个简单的财务脚本,该表如下所示: 我想要这样的结果 有人可以帮助我解决我的问题吗? 谢谢 问题答案: 正如@Quassnoi指出的那样,这对于MySQL来说不是很有效。我尝试使用怪胎连接而不是子查询,因为内部查询本身就可以使用。 编辑 对此引起了一些兴趣,发现连接版本的速度是@Quassnoi

  • 问题内容: 我想检索限制为0,x的特定用户的所有行。 所以我只想问问有没有办法在不调用返回x&的count(id)的方法的情况下检索mysql中的所有行,而不会重载在查询和withour string中完全没有限制的现有函数的重载。 )功能。 因为在内部,当我们选中“显示所有”复选框时,mysql可能会使用它,然后显示taht表的所有行 问题答案: 一个简单的解决方案是将int的最大范围发送到方法

  • 问题内容: 考虑这样的一张桌子 问题是,如果我给定值2和5,我应该得到102和105,而102和105都同时具有值​​2和5,或者如果我给定值1和3,我应该得到100和104。 我如何仅用一个sql命令就能做到这一点?我需要一个尽可能轻的查询。 并使用UNION,INTERSECTION或NESTED SQL,哪个更快,更慢,更重? 在此先感谢Ergec 问题答案: 有很多解决方案。除了Jhonn

  • 问题内容: 我需要一个表来存储一些评分,在此表中,我有一个 综合索引(user_id,post_id) 和其他列来标识不同的评分系统。 在此表中,我没有 主键, 因为 主键 必须是唯一的,而INDEX不必是唯一的,就我而言,唯一性是一个问题。 例如我可以有 缺少PRIMARY KEY可能会导致性能问题?我的表结构好还是需要更改? 谢谢 问题答案: 几点: 听起来您只是在使用表的当前唯一特性,并将其

  • 问题内容: 在MySQL中,我有此查询 日期格式 我只选择 2012年1月以后 的书籍。我尝试使用,但这不起作用。 有任何想法吗? 问题答案: 使用功能 或使用和功能 或使用功能 或使用和运算符 看到这个SQLFiddle

  • 问题内容: 我在MySQL表中有一个名为CODE的列,该列可以为NULL。假设我有一些带有CODE =’C’的行,我想在选择的结果集中忽略它们。我的结果集中可以有CODE = NULL或CODE!=’C’。 以下查询不返回CODE为NULL的行: 但是此查询按预期工作,我知道这是正确的方法。 我的问题是为什么只有CODE!=’C’不会返回CODE = NULL的行?绝对“ C”不是NULL。我们在