Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GROUP BY returns 1 invalid result if no rows meet condition #79

Open
silverhawk184 opened this issue Mar 6, 2015 · 11 comments
Open

GROUP BY returns 1 invalid result if no rows meet condition #79

silverhawk184 opened this issue Mar 6, 2015 · 11 comments

Comments

@silverhawk184
Copy link

If there is a query that has no results, but contains a GROUP BY, it returns one result regardless, with the data of "undefined"

console.log(alasql('SELECT Name FROM ? WHERE 1=0 GROUP BY Name',[[{Name:'test'}]]));
returns: [{Name: 'undefined'}] but should be []
@agershun agershun added the ! Bug label Mar 6, 2015
@silverhawk184
Copy link
Author

Another issue with GROUP BY is that any field in the result that is not in the group is 'undefined'. MySQL simply returns the data from the first retrieved row.

alasql('SELECT Type,Name FROM ? GROUP BY Type',[[{Type:'PT',Name:'Steve'},{Type:'PT',Name:'Dan'},{Type:'FT',Name:'John'}]]);

Returns

[{Name: undefined, Type: "PT"},{Name: undefined, Type: "FT"}]

Should be

[{Name: "Steve", Type: "PT"},{Name: "John", Type: "FT"}]

@agershun
Copy link
Member

Thank you! For the second question you should:
a) add Name to the GROUP BY clause
b) Use FIRST() aggregator

var res = alasql('SELECT Type,Name FROM ? GROUP BY Type, Name',[...);

or

var res = alasql('SELECT Type,FIRST(Name) FROM ? GROUP BY Type',[...]);

For the first question - sorry, it still in progress...

@agershun
Copy link
Member

Try this example in jsFiddle

@silverhawk184
Copy link
Author

Yes, for first question, I am able to get away with this as I already always check for results:

var res=alasql('SELECT pkey,Name FROM ? WHERE 1=0 GROUP BY Name',[[{Name:'test'}]]));
if(res.length>0 && typeof res[0].pkey !== 'undefined'){} //use a field that is guaranteed to never be undefined

@silverhawk184
Copy link
Author

Sorry, just a tweak on your example for others. (It works exactly as I would have expected it to from within mySQL)

var res = alasql('SELECT Type,FIRST(Name) FROM ? GROUP BY Type',[...]);

returns [[{Type:"foo","FIRST(Name)":"bar"}]]
Make sure you include the as statement.

var res = alasql('SELECT Type,FIRST(Name) AS Name FROM ? GROUP BY Type',[...]);

will return [[{Type:"foo",Name:"bar"}]]

Is there a way you can test if the fields are requested naked, to automatically apply the FROM() function when used in a GROUP BY? Maybe in an upcoming version?

@mathiasrw
Copy link
Member

👍

@agershun agershun self-assigned this Mar 24, 2015
@agershun
Copy link
Member

Is there a way you can test if the fields are requested naked, to automatically apply the FROM() function when used in a GROUP BY?

I think, that the standard SQL reaction is to throw a error like "column is not found". I think, Alasql can check this, but only for SELECT with GROUP BY clause. Plus, it is hard to recognize these "naked" columns in expressions, like:

    SELECT mycol+1 FROM mytable GROUP BY othercol

@agershun agershun added this to the SQL milestone May 21, 2015
@mathiasrw
Copy link
Member

Is this issue resolved?

@dogma-systems
Copy link

There is news about this bug? Thanks in advance

@mathiasrw
Copy link
Member

mathiasrw commented Jun 11, 2018

Well... its now returning [{}] instead of the original problem - but its still not correct.

Any help to resolve this would be awesome.

http://jsfiddle.net/t780pnz1/

@tran4o
Copy link

tran4o commented Feb 17, 2020

adding HAVING count(*) > 0 seems to fix this problem

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment