【问题标题】:MySQL GROUP_CONCAT headacheMySQL GROUP_CONCAT 头疼
【发布时间】:2009-10-03 17:43:18
【问题描述】:

为了性能,我需要为 GROUP_CONCAT 设置一个限制,

我需要知道是否有未包含的行。

怎么做?

编辑

让我提供一个人为的例子:

create table t(qid integer unsigned,name varchar(30));

insert into t value(1,'test1');    
insert into t value(1,'test2');    
insert into t value(1,'test3');

select group_concat(name separator ',') 
  from t 
 where qid=1;

+----------------------------------+
| group_concat(name separator ',') |
+----------------------------------+
| test1,test2,test3                |
+----------------------------------+

但是现在,我最多想对 2 个条目进行分组,并且需要知道是否有一些条目没有包含在结果中:

+----------------------------------+
| group_concat(name separator ',') |
+----------------------------------+
| test1,test2                      |
+----------------------------------+

我需要知道还有另一个条目(在本例中是“test3”)

【问题讨论】:

  • 我已经给出了一个详细的例子,清楚吗?
  • 感谢您提供示例。您想如何知道值列表何时超出您的限制?
  • @rexem,这个要求有很多情况。如果值列表超出我的限制,应该显示一个“显示全部”链接。

标签: sql mysql group-concat


【解决方案1】:

这应该可以解决问题

SELECT 
SUBSTRING_INDEX(group_CONCAT(name) , ',', 2) as list , 
( if(count(*) > 2 , 1 , 0)) as more
 FROM 
   t 
 WHERE 
   qid=1

【讨论】:

  • 不,这确实是一个“花招”,做更多的工作以减少检索,这不是我想要的。
  • 此时不支持 group_concat 中的限制,任何基于查询的解决方案都比像这样的简单函数调用做得更多。
  • 这可能是你能得到的最接近的了,如果你想从 group_concat 中得到一个设定的数据大小(例如,恰好是一定数量的值),它是相对有效的;但如果你想让它表现得像一个限制,那就不是那么多了。
【解决方案2】:

你打算如何设置限制?它会解决哪些性能问题?

您可以使用count(*) 获取组中的行数并将其与限制进行比较。

【讨论】:

  • @Lukáš Lalinský,抱歉我迟到的澄清!
猜你喜欢
  • 2011-03-15
  • 1970-01-01
  • 2013-07-22
  • 2012-06-22
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多