【问题标题】:MySQL query help - 'count' as variable not working as expectedMySQL 查询帮助 - 'count' 作为变量未按预期工作
【发布时间】:2016-07-17 15:13:38
【问题描述】:

我有以下(相当复杂的)查询:

SELECT
  @idx := 
    CASE 
      WHEN @prev_paper = paper_id
        THEN @idx +1
      ELSE 1 
    END AS idx,
@prev_paper := t1.paper_id AS paper_id,
@cnt := (SELECT COUNT(DISTINCT(organization)) as dcnt from authors A INNER JOIN authors__papers AP on AP.author_id = A.author_id where AP.is_contact_author < 1 AND paper_id = @prev_paper GROUP BY paper_id) as org_count,
IF(@cnt > 1, GROUP_CONCAT('{', @idx, '}', first_name, last_name), GROUP_CONCAT(first_name, last_name)) AS names
FROM (
SELECT 
AP.paper_id as paper_id, A.organization, A.first_name, A.last_name, A.country
FROM authors__papers AP
INNER JOIN authors A ON A.author_id = AP.author_id
WHERE AP.is_contact_author <1
) AS t1, (
SELECT @prev_paper :=  '', @idx :=0
) AS t2
GROUP BY paper_id, organization
ORDER BY paper_id, organization

它输出结果如下:

idx paper_id    org_count   names
1   5002        2           MarioIannazzo,EduardAlarcon
2   5002        2           {2}VikramPassi,{2}HimadriPandey,{2}MaxLemme
1   5003        1           {1}JiaSun
1   5004        1           Juan A.Leñero-Bardallo,AngelRodríguez-Vázquez,RicardoCarmona-Galán
1   5005        3           AlexandreVernhet,JeanCoignus
2   5005        3           {2}GerardGhibaudo
3   5005        3           {3}Jean-LucOgier,{3}GiulioTorrente,{3}DavidRoy
1   5006        1           {1}JerodMason,{1}PaulDicarlo,{1}HanchingFuh,{1}DavidWhitefield,{1}FlorinelBalteanu
1   5007        3           SivkhengKor,DavidSchwartz,JanosVeres,PingMei
2   5007        3           {2}ChristerKarlsson,{2}PerBroms
3   5007        3           {3}Tse NgaNg
...

如您所见,'org_count' (@cnt) 没有按预期工作。 '@idx' 有时不会附加到名称中,因为它 > 1(如 5002),有时因为它 = 1(如 5003、5006 ...)而不是预期的。这应该看起来像:

idx paper_id    org_count   names
1   5002        2           {1}MarioIannazzo,{1}EduardAlarcon
2   5002        2           {2}VikramPassi,{2}HimadriPandey,{2}MaxLemme
1   5003        1           JiaSun
1   5004        1           Juan A.Leñero-Bardallo,AngelRodríguez-Vázquez,RicardoCarmona-Galán
1   5005        3           {1}AlexandreVernhet,{1}JeanCoignus
2   5005        3           {2}GerardGhibaudo
3   5005        3           {3}Jean-LucOgier,{3}GiulioTorrente,{3}DavidRoy
1   5006        1           JerodMason,PaulDicarlo,HanchingFuh,DavidWhitefield,FlorinelBalteanu
1   5007        3           {1}SivkhengKor,{1}DavidSchwartz,{1}JanosVeres,{1}PingMei
2   5007        3           {2}ChristerKarlsson,{2}PerBroms
3   5007        3           {3}Tse NgaNg
    ...

这就像某事似乎偏离了 1,但我终其一生都无法弄清楚是什么或为什么。任何帮助表示赞赏!

【问题讨论】:

  • 一方面,您没有安全地使用变量。如果您曾经使用过它们,请参阅 Baron 的 Required Reading 博客。我几乎已经放弃向here 之类的人指出这一点。 “嘿,我得到了正确的结果”......“是的,你是对的,我错了”......所以我去听音乐
  • 12 这样的人写文章非常耗时。花几个小时仍然出错并不少见。所以并不是人们不想提供帮助,他们只是有一半的时间没有提供帮助(或者他们是黑客并且不知道更好)。堆栈上的奖励系统倾向于回答人们理解的简单的棒棒糖问题。可变答案不在其中。

标签: mysql sql


【解决方案1】:

标记为已回答。 @Drew 在他的评论中提供了指向Required Reading 的链接,希望能找到解决方案。

【讨论】:

    【解决方案2】:

    我无法真正说出您希望查询做什么,但我想我知道问题所在。 MySQL 不保证 select 子句中表达式的求值顺序。因此,变量在某些表达式中被赋值,然后在其他表达式中使用——但评估顺序不清楚。

    我理解查询的问题是基于查询的第一列是@prev_paper,但结果的第一列标记为id

    正确使用变量的诀窍是将所有逻辑放在一个表达式中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多