简体   繁体   中英

Select only unique row/record in mysql

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

would only return one record.

I tired something like this but it doesn't work

"SELECT DISTINCT(city) AS city,state_prefix,lattitude,longitude  FROM zip_code WHERE city LIKE '$queryString%' LIMIT 10"

Thank you...

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.

Edited

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 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, eg 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 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'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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM