There are two tables fruits and fruits_seasons in the schema and I wanted to get all the monsoon fruits. While trying so I noticed a weird response.
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=77d52b2736a04a5adf4ffe80881cd4ab
Monsoon months
select group_concat(fruit_id) from fruits_seasons where monsoon = 1;
| group_concat(fruit_id) |
|---|
| 2,8,9,11,13,15 |
The query I used
SELECT
f.name AS name, f.price AS price
FROM
fruits f
where f.id in (select group_concat(fruit_id) from fruits_seasons where monsoon = 1);
My expected result
| name | price |
|---|---|
| lemon | 15.00 |
| carrot | 35.00 |
| papaya | 18.00 |
| custard apple | 15.00 |
| mango | 25.00 |
| apple | 25.00 |
The result I got
| name | price |
|---|---|
| lemon | 15.00 |
What is the reason am I getting a single row instead of multiple?
CodePudding user response:
GROUP_CONCAT() returns a string which is a comma separated list of values, so your code is equivalent to:
WHERE f.id IN ('2,8,9,11,13,15')
So, you compare the id, which is an integer to the only item in the list which is a string and in this case MySql tries to convert the string to an integer.
The result of the conversion is 2 (the starting part of the string which can be successfully converted to an integer) and finally your code is equivalent to:
WHERE f.id IN (2)
If you have to use GROUP_CONCAT() for your requirement, instead of the operator IN use the function FIND_IN_SET():
SELECT f.name, f.price
FROM fruits f
WHERE FIND_IN_SET(f.id, (SELECT GROUP_CONCAT(fruit_id) FROM fruits_seasons WHERE monsoon = 1));
But it's easier this way:
SELECT f.name, f.price
FROM fruits f
WHERE f.id IN (SELECT fruit_id FROM fruits_seasons WHERE monsoon = 1);
See the demo.
