使用 GROUP_CONCAT、GROUP BY、HAVING 进行选择

Posted

技术标签:

【中文标题】使用 GROUP_CONCAT、GROUP BY、HAVING 进行选择【英文标题】:SELECT with GROUP_CONCAT, GROUP BY, HAVING 【发布时间】:2011-12-16 11:38:33 【问题描述】:

我有一张带有奇数 ID 的表,我想为不同的票号选择组合。这是我的查询:

SELECT
ticket_id,
GROUP_CONCAT(odd_id) as oddsconcat
FROM ticket_odds
GROUP BY ticket_id

它给了我以下信息:

'28', '14472510,14472813,14472546,14472855,14472746,14472610,14472647'
'29', '14471149,14471138,14471125,14475603'
'30', '14471823,14471781,14471655,14471865,14471597,14471968,14471739,14471697,14471923'
'31', '14473874,14473814,14473862,14473838,14473790,14473802,14473826,14473850'
'32', '14471588,14472766,14471651,14471777,14471419'
'33', '14472647,14472605,14471650,14471734'
'34', '14471588,14472704,14471817'
'35', '14475279,14474499'
'282', '14472756,14472652,14472813'
'283', '14471588,14472766,14471419,14471777,14471651'
'284', '14474521'
'285', '14474529'
'286', '14474547'
'287', '14471134,14471199,14473636,14471242,14471398,14471237'

但是如果我使用Having 函数,它不会给我结果。显然:它给了我以下内容:

SELECT
ticket_id,
GROUP_CONCAT(odd_id) as oddsconcat
FROM ticket_odds
GROUP BY ticket_id
HAVING oddsconcat = '14475279,14474499'

返回ticket_id 35 并且每个人都很高兴并且代码工作正常,但是如果oddsconcat 大于这个,它不会返回任何值。例如:

SELECT
ticket_id,
GROUP_CONCAT(odd_id) as oddsconcat
FROM ticket_odds
GROUP BY ticket_id
HAVING oddsconcat = '14473874,14473814,14473862,14473838,14473790,14473802,14473826,14473850'

【问题讨论】:

group_concat_max_len 是什么?你的字符串是否超过了这个长度? 'group_concat_max_len', '1024' 但对我来说没关系,因为当我选择没有 HAVING STATEMENT 时,它给了我想要的东西,但是在 HAVING CLAUSE 中出现问题:/ 【参考方案1】:

我会改写为:

SELECT 
ticket_id, 
GROUP_CONCAT(DISTINCT odd_id ORDER BY odd_id ASC) as oddsconcat 
FROM ticket_odds 
GROUP BY ticket_id 
HAVING oddsconcat = .....

现在oddsconcat 中的输出是确定性的,因为重复项被消除并且项目按升序排列。 这应该使匹配更容易。

【讨论】:

天啊。谢谢你,小伙伴。如果你在这里,我会为你买些啤酒 HAVING oddsconcat = here 中放入的内容是group_concat 的列是否具有字符串值?例如,如果有 3 种类型的oddsconcat(假设字符串类型)a、b、c 现在我只想对只有 a 和 b 的 concat 列进行分组!【参考方案2】:

假设(ticket_id, odd_id) 组合为UNIQUE,这将为您提供包含这两个赔率(可能还有更多其他赔率)的所有彩票:

SELECT
  ticket_id,
  GROUP_CONCAT(odd_id) as oddsconcat
FROM ticket_odds
WHERE odd_id IN (14475279,14474499)
GROUP BY ticket_id

这将为您提供包含这两个赔率的所有门票(并且没有其他赔率):

SELECT
  ticket_id,
  GROUP_CONCAT(odd_id) as oddsconcat
FROM ticket_odds
WHERE odd_id IN (14475279,14474499)     --- list
GROUP BY ticket_id
HAVING COUNT(*) = 2                     --- size of list

【讨论】:

好方法@ypercube。但由于很多原因,我无法使用这个算法。无论如何谢谢:) 我试过你的版本(第二个)但它不起作用..如果我在 (1,2) 中有 'odd_id 并且 COUNT = 2 它给了我 '1,2' 和 '1 ,2,?'也是,因为在这两种情况下都只需要'1,2'。 :( “它给了我1,2,?”是什么意思。 ? 代表什么?另一个号码? NULL 的值是否存储在 odd_id 列中? ?表示任何数值。不,我在奇数 ID 中没有 NULL 值。

以上是关于使用 GROUP_CONCAT、GROUP BY、HAVING 进行选择的主要内容,如果未能解决你的问题,请参考以下文章

MySQL group by GROUP_CONCAT函数使用

在 Netezza 中使用 GROUP_CONCAT 时缺少 ORDER BY 的解决方法

在 SQLite 的 GROUP_CONCAT 函数中使用 ORDER BY 子句

Warning: (1260, 'Row xxx was cut by GROUP_CONCAT()')

SQLite - 是不是可以在同一个查询中使用 group_concat 函数但 'GROUP BY' 不同的标准?

group_concat sqlite 和 order by