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

GROUP_CONCAT和LEFT_JOIN问题-并非所有行都返回

宋烨烁
2023-03-14
问题内容

假设我的数据库方案如下:

T_PRODUCT
id_product (int, primary)

two entries: (id_product =1) , (id_product =2)

T_USER
id_user (int, primary)
id_product (int, foreign key)
name_user (varchar)

two entries: (id_product=1,name_user='John') , (id_product=1,name_user='Mike')

如果我运行第一个查询来获取所有产品及其用户(如果有的话),则会得到以下信息:

SELECT T_PRODUCT.id_product, T_USER.name_user 
FROM T_PRODUCT
LEFT JOIN T_USER on T_USER.id_product = T_PRODUCT.id_product;

>>
id_product name_user
1          John
1          Mike
2          NULL

对我来说看上去很好。现在,如果我想做同样的事情,除了我希望每行有一个产品,并使用级联的用户名(如果有任何用户,否则为NULL):

SELECT T_PRODUCT.id_product, GROUP_CONCAT(T_USER.name_user) 
FROM T_PRODUCT
LEFT JOIN T_USER on T_USER.id_product = T_PRODUCT.id_product;

>>
id_product name_user
1          John,Mike

**expected output**:
id_product name_user
1          John,Mike
2          NULL

如果没有产品的用户,即使存在 LEFT JOIN ,GROUP_CONCAT也会阻止mysql为该产品生产线。

  1. 这是预期的MySQL行为吗?
  2. 有什么办法可以使用GROUP_CONCAT或其他函数来获得预期的输出吗?

问题答案:

啊,找到我的答案:

使用 GROUP_CONCAT* 时,您永远不会忘记 GROUP BY 子句。我在第二个查询中失踪了。 *GROUP BYT_PRODUCT.id_product

如果有人像我一样心不在a,我将不提问题。

编辑

从这个答案中,我认为我还可以激活SQL模式ONLY_FULL_GROUP_BY,以在丢失或不正确的GROUPBY的情况下强制MySQL引发错误。



 类似资料:
  • 当我遇到这个问题时,我正在温习动态编程。我设法用DP来确定子集和问题有多少解。 基于子集总和-恢复解决方案,我使用以下方法来检索子集,因为该集将始终被排序: 但是,由于它是一种贪婪的方法,因此它仅在每个子集的最大元素不同时才有效。如果两个子集具有相同的 max 元素,则它只返回具有较大值的子集。因此,对于总和为 10 的元素 [1, 2, 3, 4, 5],它只返回 当它应该回来的时候 我可以在w

  • CATALINA_OPTS=“-dcom.sun.management.jmxremote-dcom.sun.management.jmxremote.port=6969-dcom.sun.management.jmxremote.ssl=false-dcom.sun.management.jmxremote.authenticate=false${CATALINA_OPTS}” 并使用jcons

  • 我有一个Spring批处理应用程序,它从DB表中读取记录并在Writer类中调用REST API以获取要缓存的数据。然而,我观察到并非线程池中的所有线程都在运行。它们只是以4-5的批处理运行,因为应用程序需要5小时才能进行120K调用。以下是Spring批处理上下文 任务执行者: 批量作业: 读卡器配置:请注意,数据源的连接数为20 min/max

  • 目前,我有一个很大的决策表,其中包含许多条件/操作。决策表一直有效,直到我最近添加了一个新操作。它似乎没有执行。 通过setter更新以下字段: PRM_LIB01 PRM_LIB09 PRM_LIB10 但是,未更新PRM\U LIB18。即使我切换PRM\u LIB10和PRM\u LIB18的操作,也只有PRM\u LIB10的列得到更新。 因此,基于此,我希望它也执行setPRM\u LI

  • 当使用https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html描述的术语搜索时,我没有看到预期的结果 ElasticSearch版本为2.3.2:使用该版本创建数据: 此查询显示两条记录: 这个查询显示了一条记录,正如预期的那样: 但是使用不同的术语将不会产生记录: 不返回记录

  • 我正在研究一个使用反射调用另一个方法的方法。然而,“其他方法”可以引发异常,我想用它的原始堆栈信息和内部异常来传播该异常。这只是因为使用反射的方法不应该处理异常,调用方应该处理异常。 下面是代码的简化版本: 该代码显然不会编译,因为Test方法(根据编译器)并不总是返回值。我可以在异常DispatchInfo之后添加一个return false。捕获,但我想知道是否有更好的方法来实现同样的目标。不