I want to fetch a table named supplier_products which has following columns
ID Item_id supplier_id variant_id  price    lat        lng   serving_radius(in km)
1     1      2            12       22.00  26.11360000 85.39430000    1
2     1      3            12       44.00  26.11360000 85.39430000    4
3     1      2            13       25.00  26.11360000 85.39430000    4
4     1      3            13       23.00  26.11360000 85.39430000    4
Now for searching supplier products near a latitude and longitude say($lat = 26.1136;$long = 85.3643;) . i was using this query
SELECT *, (6371 * acos(cos(radians('$lat')) * cos(radians(lat)) * cos( radians(lng) - radians('$long')) + sin(radians('$lat')) * sin(radians(lat)))) AS distance FROM supplier_products HAVING distance <= serving_radius ORDER BY distance")
The above query returns all rows which serves the input $lat & $long.
But now i want to return all columns of only those rows having distinct variant_id which serves the input $lat & $long
I tried using a GROUP BY -
SELECT *, (6371 * acos(cos(radians('$lat')) * cos(radians(lat)) * cos( radians(lng) - radians('$long')) + sin(radians('$lat')) * sin(radians(lat)))) AS distance FROM supplier_products GROUP BY variant_id HAVING distance <= serving_radius")
But it eliminates some desired rows as GROUP BY is being performed before the HAVING clause. So it eliminates some required rows which are in the serving radius.
I am using PHP & MYSQL
EDIT- I want this as my output
ID Item_id supplier_id variant_id  price    lat        lng   serving_radius(in km)
2     1      3            12       44.00  26.11360000 85.39430000    4
3     1      2            13       25.00  26.11360000 85.39430000    4
As row with ID-1 does not serves the input $lat/$long
But my attempt gave the following result -
ID Item_id supplier_id variant_id  price    lat        lng   serving_radius(in km)
3     1      2            13       25.00  26.11360000 85.39430000    4
Because GROUP BY eliminated the 2nd row