I would like to see how I can get only unique row/records that have a unique city and not care if it\'s capital so for example:
Akron
akron
aKRON
You can us a function in a GROUP BY to convert all names to upper or lowercase:
SELECT city,state_prefix,lattitude,longitude
FROM zip_code WHERE city LIKE '$queryString%'
GROUP BY UPPER(city), UPPER(state_prefix) LIMIT 10
I'm assuming if a city and state match, lattitude and longitude can be safely rolled up.
It doesn't work on other DBMS, but in MySql you could use this:
SELECT city, state_prefix,lattitude,longitude
FROM zip_code WHERE city LIKE '$queryString%'
GROUP BY city
LIMIT 10
MySql ignores case when comparing strings, e.g. this returns true:
select 'hello'='Hello '
and you can also group by a single field (city in this case) and return all others field. Values of other fields are undetermined, they are usually the ones in the first row but you can't relay on that.
You can use this mysql-only trick:
SELECT city, state_prefix, lattitude,longitude
FROM zip_code WHERE city LIKE '$queryString%'
GROUP BY city, state_prefix -- Here's the trick
LIMIT 10
This will return the first row encountered for each unique value of city
and state_prefix
.
Other databases will complain that you have non=-aggregated columns not listed in the group by or some such message.
Previously I claimed that not using the upper()
function on the grouped-by columns it would return all case variations, but that was incorrect - thanks to SalmanA for pointing that out. I verified using SQLFiddle and you don't need to use upper()
.
It's possible your table, or your city column, has a case-sensitive collation setting.
You can choose the collation explicitly in your SELECT statement like so. If you choose a case-insensitive collation, the DISTINCT
keyword will do what you want it to do.
SELECT DISTINCT
city COLLATE utf8_general_ci,
state_prefix COLLATE utf8_general_ci,
lattitude,longitude
FROM zip_code
WHERE city LIKE '$queryString%'
LIMIT 10