我有以下(相当复杂的)查询:
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”有时候不应附加到名称上,因为它是&gt; 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点似乎有些东西,但是我不能为我的生活弄清楚是什么或为什么。任何帮助表示赞赏!
答案 0 :(得分:1)
评论太长了。
我无法真正告诉你想要查询的内容,但我想我知道这个问题。 MySQL不保证select
子句中表达式的评估顺序。因此,变量在某些表达式中被赋值,然后在其他表达式中使用 - 但是评估的顺序还不清楚。
我理解查询的问题基于查询的第一列@prev_paper
之类的内容,但结果的第一列标记为id
。
正确使用变量的技巧是将所有逻辑放在一个表达式中。
答案 1 :(得分:1)
标记为已回答。 @Drew在他的评论中提供了Required Reading的链接,希望能够找到解决方案。