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